我有一个 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 使其工作?如果那不是原因,有谁知道可能出了什么问题?
如有任何帮助,我将不胜感激,在此先致谢!
最佳答案
您对 MyThread 的签名有误。你不应该转换它,你应该确保你的函数与签名匹配。正确的代码是:
CreateThread(NULL, 0, MyThread, NULL, 0, NULL);
DWORD WINAPI MyThread(LPVOID param)
{
// etc
}
除此之外,你不应该在你的 DllMain 中做任何事情作为 @GSerg 评论,因为当你在那里时有一个锁被持有。通过执行任何复杂的操作,您可能会无意中加载另一个 DLL,从而导致死锁。
相反,您通常会在 DLL 中有一个单独的初始化函数,您的调用代码可以在加载 DLL 后调用该函数。
关于c++ - 64 位 DLL 中的 CreateThread 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12014085/