C++ 64位DLL中的CreateThread赢得';行不通

C++ 64位DLL中的CreateThread赢得';行不通,c++,c,visual-studio-2010,winapi,64-bit,C++,C,Visual Studio 2010,Winapi,64 Bit,我有一个32位和一个64位的可执行文件。两者都加载同一位的DLL,就像64位可执行文件加载64位DLL一样。无论如何,32位DLL工作得很好,它创建了一个线程并弹出一个hello world messagebox。然而,在64位DLL中,这段代码永远不会执行。就像createthread失败了一样 case DLL_PROCESS_ATTACH: myFunc(); break; case DLL_THREAD_ATTACH: case D

我有一个32位和一个64位的可执行文件。两者都加载同一位的DLL,就像64位可执行文件加载64位DLL一样。无论如何,32位DLL工作得很好,它创建了一个线程并弹出一个hello world messagebox。然而,在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后调用该函数

您的MyThread签名错误。您不应该强制转换它,您应该确保您的函数与签名匹配。正确的代码是:

CreateThread(NULL, 0, MyThread, NULL, 0, NULL);

DWORD WINAPI MyThread(LPVOID param)
{
    // etc
}
除此之外,你不应该在DllMain中以@GSerg评论的形式做任何事情,因为当你在那里的时候,有一个锁被锁住了。通过执行任何复杂的操作,您可能会无意中加载另一个DLL,从而导致死锁


相反,在DLL中通常会有一个单独的初始化函数,调用代码可以在加载DLL后调用该函数

好的,解决方法很简单,线程退出得太早。添加WaitForSingleObject(hThread,INFINITE);解决了这个问题。由于某些原因,在32位中不需要。:)

好的,解决方法很简单,线程退出得太早。添加WaitForSingleObject(hThread,INFINITE);解决了这个问题。由于某些原因,在32位中不需要。:)

可能的重复可能的重复作为一般规则,如果您将指向函数的指针强制转换为与原来完全相同的类型以外的任何用途,则您可能正在做一些根本性的破坏。作为一般规则,如果您将指向某个函数的指针强制转换为与原来完全相同的类型,而不是出于任何目的,那么您很可能正在做一些根本性的破坏。或者可能是这样,但只是巧合,您的32位程序没有过早退出?您也应该将
Wait..
添加到您的32位程序中。我无法理解您的答案,除非我假设您的意思是主程序提前退出并在显示消息框之前终止线程。阿尔伯特也许是,但这只是一个巧合,你的32位程序没有过早退出?您也应该将
Wait..
添加到您的32位程序中。我无法理解您的答案,除非我假设您的意思是主程序提前退出并在显示消息框之前终止线程。艾伯特