我有一个32位和64位可执行文件。两者都加载一个相同位的DLL,就像在64位可执行文件中加载64位dll一样。无论如何,32位DLL工作得很好,它创建一个线程并弹出一个hello world消息框。然而,64位DLL,这段代码永远不会执行。就像createthread失败一样。
case DLL_PROCESS_ATTACH:
myFunc();
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
void myFunc()
{
HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&MyThread, NULL, 0, NULL);
}
DWORD WINAPI MyThread(LPVOID param)
{
MessageBoxA(0, "HELLO 64", 0,0);
ExitThread(0);
}
这些是来自DLL的一些片段。我已经搞砸了,我能想出的就是堆栈对齐失败了吗?如果这是原因,我如何正确调用CreateThread使其工作?如果这不是原因,有谁知道可能出错了什么?
我会非常感谢任何帮助,提前谢谢!
答案 0 :(得分:3)
MyThread的签名错误。你不应该施放它,你应该确保你的功能与签名相匹配。正确的代码是:
CreateThread(NULL, 0, MyThread, NULL, 0, NULL);
DWORD WINAPI MyThread(LPVOID param)
{
// etc
}
除此之外,你不应该在你的DllMain中做任何事情作为@GSerg评论,因为当你在那里时有一个锁。通过执行任何复杂的操作,您可能会无意中加载另一个导致死锁的DLL。
相反,您的DLL中通常会有一个单独的初始化函数,调用代码在加载DLL后可以调用它。
答案 1 :(得分:0)
好的解决很简单,线程退出得太早了。添加WaitForSingleObject(hThread,INFINITE);解决了这个问题。由于某种原因没有必要在32位。 :)