c++ - 64 位 DLL 中的 CreateThread 不起作用

标签 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 使其工作?如果那不是原因,有谁知道可能出了什么问题?

如有任何帮助,我将不胜感激,在此先致谢!

最佳答案

您对 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/

相关文章:

c++ - 如何捕获返回 lambda 的函数的返回值类型?

c++ - 保护新交所算法的安全

c++ - 在编译时进行字符串实习以进行性能分析

c++ - double vector 到 vector 字节

visual-studio-2010 - 尝试使用 ServiceController 时出现错误 MSB4062

c++ - std::greater 未在 MSVC2012 中定义

c++ - 如何避免重复使用socket?

c - 我如何实现解析?

c - ISO C90 禁止变长数组

windows - QtCreator 无法打开包含文件 (Windows)