PostMessage:如何将消息发布到没有窗口的进程?

时间:2014-09-03 15:06:14

标签: c++ windows multithreading winapi dll

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

消息泵可以简单如下:

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

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

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