【问题标题】:PostMessage: How to post a message to a process that does not have a window?PostMessage:如何向没有窗口的进程发布消息?
【发布时间】:2023-03-26 20:36:01
【问题描述】:

我正在使用 Windows 凭据提供程序使用对用户进行身份验证的设备。与设备的通信在单独的线程上完成。

我创建并注册了一个 Windows 接口的凭据提供程序dlldll 创建一个线程来验证用户并调用凭据提供程序。但是,对凭据提供程序的调用当前在创建的线程上,而不是 windows Logon/UI 所在的主线程上。这显然会导致线程问题。

解决方案是使用PostMessage 将消息从创建的线程发布到Logon/UI 线程。我只将PostMessage 与Windows gui 应用程序一起使用。如何将线程中的消息发布到应用程序中的 windows Logon/UI 进程?

【问题讨论】:

  • 你不能。 PostMessage 需要一个窗口。如果您的目标没有窗口,您可以致电PostThreadMessage。但是,如果目标线程没有窗口,它很可能也没有消息循环,甚至永远不会知道消息在其队列中。我不确定你为什么在最后一段中命名 DLL。 DLL 是二进制映像,就像 EXE 一样。 DLL 不对没有 GUI 负责。这一段没有意义。
  • @IInspectable 感谢您提供信息。我将研究Logon/UI 以了解它是否具有事件循环。我怀疑确实如此。
  • 即使目标进程运行消息循环,PostThreadMessage 也可能不可靠。一旦目标进程显示模态 UI,使用它自己的嵌套消息循环,线程消息将被过滤和丢弃。如果您同时拥有这两个流程,您可以实现更通用和更可靠的基础架构,例如使用序列化和命名管道传输通道。

标签: c++ windows multithreading winapi dll


【解决方案1】:

我最初的反应是一样的:你不能。

但这不是一个完整的答案:您不必有一个完整的窗口,您只需要一个消息泵。 COM 在 STA(单线程单元)中运行时使用相同的技术。 STA 将创建一个隐藏窗口。这就是本地服务器主线程需要实现 Windows 消息泵的原因。

消息泵可以很简单:

MSG msg;
while (GetMessage (&msg, 0, 0, 0))
   DispatchMessage (&msg);

COM 这样做是为了允许在不同进程中的客户端和服务器之间进行 RPC。您也可以这样做(谷歌搜索 COM STA,或在 MSDN 上阅读)

但你可能不需要走那条路…… 据我了解,您拥有两个线程(它们都在您的代码库中),并且它们在同一个进程中运行。您可以使用一些共享内存 + 信号方法(如全局变量和互斥锁)。

【讨论】:

  • 解决方案是使用条件变量并等到线程完成或我没时间了。这个答案对我有很大帮助。
猜你喜欢
  • 1970-01-01
  • 2013-12-18
  • 2010-12-19
  • 1970-01-01
  • 2019-06-27
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 2020-09-15
相关资源
最近更新 更多