0

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

我将非常感谢任何帮助,在此先感谢!

4

2 回答 2

3

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

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

DWORD WINAPI MyThread(LPVOID param)
{
    // etc
}

除此之外,您不应该在您的 DllMain 中像@GSerg 评论那样做任何事情,因为当您在那里时有一个锁被持有。通过执行任何复杂的操作,您可能会无意中加载另一个导致死锁的 DLL。

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

于 2012-08-17T23:16:43.747 回答
0

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

于 2012-08-19T07:02:20.550 回答