【问题标题】:CreateThread in 64bit DLL won't work64 位 DLL 中的 CreateThread 不起作用
【发布时间】:2012-08-17 22:41:30
【问题描述】:

我有一个 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 中的一些 sn-ps。我已经用谷歌搜索了,我能想到的只是堆栈对齐失败了吗?如果这是原因,我该如何正确调用 CreateThread 使其工作?如果这不是原因,有谁知道可能是什么问题?

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

【问题讨论】:

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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 作为一般规则,如果您将一个指向函数的指针转换为其他任何目的,而不是将其转换回原来的完全相同的类型,那么您可能正在做一些根本性的破坏。
【解决方案2】:

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

【讨论】:

  • 或许是这样,但您的 32 位程序没有过早退出只是巧合?您也应该将 Wait.. 添加到您的 32 位程序中。
  • 我无法理解您的回答,除非我假设您的意思是主程序提前退出并在线程显示消息框之前将其杀死。阿尔伯特
猜你喜欢
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 2014-08-08
  • 2015-01-07
相关资源
最近更新 更多