我正在尝试获取从dll加载dll的进程的句柄。
我的方法是: 在DLL_PROCESS_ATTACH中我调用EnumWindows(EnumWindowsProc,NULL);
我的EnumWindowsProc实现如下:
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) {
if(GetCurrentProcessId() == GetWindowThreadProcessId(hWnd,NULL)){
MessageBox(hWnd,L"I loaded your dll!",L"it's me",MB_OK);
return TRUE;
}
return FALSE;
}
问题是GetCurrentProcessId()== GetWindowThreadProcessId(hWnd,NULL)永远不会成立(如果我将消息框调用放在if块之外,一切正常,但每次列出的窗口都会调用一次)。
还有其他方法可以达到目的吗?这种方法完全错了还是我错过了什么?
提前完成
答案 0 :(得分:4)
使用GetCurrentProcess,它返回当前进程的伪句柄。如果您需要真正的句柄,请将伪句柄传递给DuplicateHandle。
请注意,在DllMain
中执行过多操作非常危险。调用除KERNEL32
函数以外的任何函数都是非常危险的,即使这样,也有一些KERNEL32
函数不应该调用。请参阅DllMain
文档,this document和several blog posts from Microsoft开发人员建议不要在DllMain
中执行太多操作。
答案 1 :(得分:1)
最简单的方法是在需要句柄时简单地使用GetCurrentProcess。
答案 2 :(得分:0)
答案 3 :(得分:0)
你犯了一个错误:
GetWindowThreadProcessId不返回进程ID,而是返回线程ID。
你的程序必须这样写:
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) {
DWORD process;
GetWindowThreadProcessId(hWnd,&process);
if(GetCurrentProcessId() == process){
MessageBox(hWnd,L"I loaded your dll!",L"it's me",MB_OK);
return TRUE;
}
return FALSE;
}