如何安全地从DLL钩入消息泵
How do I safely hook into the message pump from a DLL?
我正在尝试从加载DLL的进程获取消息。
我试过:
SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)WndProc, hInstance, 0);
这给了我关于如何"程序X无法启动,因为y.d dll从您的系统中丢失"的错误弹出框。这就是我在标题中加上"安全"的原因。
我也试过了:
SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)WndProc, hInstance, threadId);
其中threadId
是我的DLLMain中GetCurrentThreadId()
的结果。这个可以工作,但是我没有得到窗口的任何消息(只有一堆512和1025)。
消息与线程和窗口有关,您的DLL可能由进程加载。所以没有直接对应关系。
另一方面,钩子要么是全局的,要么是单线程的。
总的来说,这意味着你必须选择是否只需要来自特定线程的消息,还是全局(特定桌面中所有进程中的所有线程),在全局中你将过滤掉你自己感兴趣的进程。
第二个代码片段是一个线程钩子。第一个是全局钩子,你肯定做错了什么,因为成功的钩子本身不会导致你提到的错误消息。
我猜你直接从DLLMain内部调用这些函数。对于可以安全地从DLLMain调用哪些函数有严重的限制,请参阅MSDN文档中的DLLMain。
没有明确的安全和不安全的函数列表,但似乎很可能在你的第一个代码片段中调用SetWindowsHookEx正在做一些在DLLMain函数中被禁止的事情,因此DLL无法正确加载
相关文章:
- boost::进程间消息队列引发错误
- 挂起和取消挂起一个文件DLL
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 导入库可以跨dll版本工作吗
- 在线编译器中的分段C++没有打印消息
- C++错误消息*成员参考.**初学者*
- 从C++dll访问C#中的一行主要参数
- 链接到自行创建的dll失败
- Log4net,将日志消息从 c++ dll 发送到 c# 应用程序?
- 核心消息传递中未处理的异常.dll在程序关闭期间
- 为什么 Python 需要 DLL 中的 GetMessage 消息泵送,而不是 Qt
- 本机 dll 从 c# 中踢出,没有错误消息
- 从DLL文件调用消息框函数时出现奇怪的字符
- 尝试使用Visual Studio 2010调试DLL(C )时的错误消息
- 使用消息处理程序将 c++ dll 调用转换为 delphi
- ctypes加载了一个没有错误消息的dll,但什么也没发生
- 为什么我会收到"Unable to find an entry point named 'SquareRoot' in DLL"消息?
- 使用Winsock DLL在简单的TCP回显服务器中分离消息
- 如何安全地从DLL钩入消息泵
- 使用Win32 API列出存储在资源专用库(DLL)中的消息id和符号名称