64位DLL中的CreateThread将无法正常工作

时间:2012-08-17 22:41:30

标签: c++ c visual-studio-2010 winapi 64-bit

我有一个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使其工作?如果这不是原因,有谁知道可能出错了什么?

我会非常感谢任何帮助,提前谢谢!

2 个答案:

答案 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位。 :)

相关问题