【发布时间】:2023-03-26 20:36:01
【问题描述】:
我正在使用 Windows 凭据提供程序使用对用户进行身份验证的设备。与设备的通信在单独的线程上完成。
我创建并注册了一个 Windows 接口的凭据提供程序dll。 dll 创建一个线程来验证用户并调用凭据提供程序。但是,对凭据提供程序的调用当前在创建的线程上,而不是 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