我目前正在尝试将DLL注入项目中,但每次使用while循环时,进程都会崩溃。 这是代码:
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call,LPVOID lpReserved ){
switch(ul_reason_for_call){
case DLL_PROCESS_ATTACH:
while(char c = getch()){
if(c == 'p'){
MessageBox(0,L"CAPT",L"CAPT",MB_OK);
}
}
break;
}
return TRUE;
}
答案 0 :(得分:2)
既然你改变了原来的问题,我会稍微重新安排一下我的答案......
在DLL入口点可以安全地执行的操作存在很大的限制。
请仔细阅读以下页面上的翻拍: https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx 和 https://msdn.microsoft.com/en-us/library/windows/desktop/aa370448(v=vs.85).aspx
例如,在DLL_PROCESS_ATTACH期间,它不应超过300毫秒(推荐时间)。你也没有返回任何东西(应该是一个布尔值)。
但是,我认为您的软件挂起的主要原因是因为MessageBox
和/或getch()
可能会在那里造成死锁。关于MessageBox
使用OutputDebugString
,请参阅此答案:https://stackoverflow.com/a/10981735/5874704
同样如评论中所述:
不要在DllMain中放置while循环。在DllMain中使用CreateThread启动新线程。把while循环放在那里
以前您还询问了DLLMain的定义。这是DllMain的"裸"功能:
BOOL WINAPI DllMain(
HINSTANCE hDllHandle,
DWORD nReason,
LPVOID Reserved)
{
BOOL bSuccess = TRUE;
switch ( nReason )
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return bSuccess;
}