我创建了一个带有表单的dll,当我们注入dll时,表单打开了。 但问题是,当我这样做时,我注入的过程,卡住了,我不能和他注意到。
这就是我所做的。
DWORD WINAPI MessageLoop(HINSTANCE hInstance)
{
hWindow = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DLGPROC(WindowProc));
MSG Msg;
while(GetMessage(&Msg, 0, 0, 0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return 0;
}
和注射:
DWORD WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPSTR lpszReserved)
{
if(dwReason == DLL_PROCESS_ATTACH)
{
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)MessageLoop(hInstance), 0, 0, 0);
}
return 0;
}
@Remy Lebeau:
DWORD WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPSTR lpszReserved)
{
if(dwReason == DLL_PROCESS_ATTACH)
{
CreateThread(0, 0, &MessageLoop, hInstance, 0, 0);
}
return 0;
}
答案 0 :(得分:3)
您对CreateThread()
的来电是错误的。您没有将MessageLoop()
的地址传递给它,实际上您正在调用MessageLoop()
。试试这个:
DWORD WINAPI MessageLoop(LPVOID lpParameter)
{
HINSTANCE hInstance = (HINSTANCE) lpParameter;
...
}
CreateThread(0, 0, &MessageLoop, hInstance, 0, 0);
BTW,CreateThread()
无法安全地拨打DllMain()
。各种MSDN文档中都明确说明了这一点。您必须将其移出DllMain()
,例如让DLL导出一个内部调用CreateThread()
的单独函数,然后让您的注入代码在DLL加载后调用导出的函数存储器中。