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

C++ PostMessage:如何将消息发布到没有窗口的进程?,c++,windows,multithreading,winapi,dll,C++,Windows,Multithreading,Winapi,Dll,我正在使用对用户进行身份验证的设备使用windows凭据提供程序。与设备的通信在单独的线程上完成 我创建并注册了一个windows接口的凭据提供程序dll。dll创建一个线程来验证用户并调用凭据提供程序。但是,对凭据提供程序的调用当前在已创建的线程上,而不是在windowsLogon/UI打开的主线程上。这显然会导致线程问题 解决方案是使用PostMessage将消息从创建的线程发布到Logon/UI线程。我只在windows gui应用程序中使用了PostMessage。如何将一条消息从线程发

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

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


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

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

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

消息泵可以简单到:

MSG msg;
while (GetMessage (&msg, 0, 0, 0))
   DispatchMessage (&msg);
COM这样做是为了在不同进程中的客户端和服务器之间允许RPC。你也可以这样做(谷歌搜索comsta,或者在网上阅读)

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

您不能
PostMessage
需要一个窗口。如果您的目标没有窗口,您可以调用。但是,如果目标线程没有窗口,那么它也可能没有消息循环,甚至永远不会知道消息在其队列中。我不知道你为什么在最后一段中命名DLL。DLL是二进制映像,就像EXE一样。DLL不负责没有GUI。这一段没有意义。@i非常感谢您提供的信息。我将研究
登录/UI
,看看它是否有一个事件循环。我怀疑是这样。即使目标进程运行消息循环,
PostThreadMessage
也可能不可靠。一旦目标进程使用自己的嵌套消息循环显示模式UI,线程消息将被过滤并丢弃。如果您拥有这两个进程,您可以实现一个更通用、更可靠的基础结构,例如使用序列化和命名管道传输通道。解决方案是使用条件变量并等待线程完成或我用完时间。这个答案在这方面对我帮助很大。