如何在DLLMain中启动一个线程?

时间:2016-12-28 02:08:10

标签: c++ multithreading c++11 dll dllmain

如何在DLLMain中启动线程意味着std :: thread - 从根本上说。没意思是WinApi,而STL意味着。当我在流程中运行该函数时,我崩溃了从该DLL调用的应用程序。提前谢谢。

此代码获取文件(exe)上的哈希值并将其写入文件。 (* 。文本)。但是应用程序崩溃了

void initialize()
{
    string buffer;
    thread t(calclulateHash, ref(buffer));
    t.detach();
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
        {
            initialize();
            break;
        }
    }
    return true;
}

2 个答案:

答案 0 :(得分:1)

DllMain()存在限制。

你不应该在DllMain中进行任何阻塞调用,因为它是从OS加载器调用的。锁定加载程序可能会阻止某些线程启动,并且通常会导致错误的操作。锁定任何类型。如果您正在尝试获取当前由需要OS加载程序锁定的线程(当您从中执行时正在持有)的锁定,那么在最佳情况下您将陷入僵局。不允许启动线程,因为当你启动线程时......你通过OS加载器再次调用这个DllMain,但现在使用DLL_THREAD_ATTACH参数。它导致相同的死锁或非法并发访问此模块的未初始化内存。

明确禁止调用LoadLibrary / LoadLibraryEx,因为这需要OS加载程序锁定。对kernel32的其他调用很好,你不能调用User32。并且不要使用CRT内存管理(除非你是静态链接),任何调用动态C运行时的东西 - 使用HeapAlloc和类似的API。否则,您将导致调用SxS运行时库。您也无法读取注册表。任何交叉二进制调用都是UB,您调用的二进制文件可能尚未初始化或已经未被使用。

度过愉快的一天。

答案 1 :(得分:0)

1 DllMain - > 2新主题 - > 3再次使用DLL_THREAD_ATTACH调用DllMain - > 4没有检查,所以新线程再次 - > 5再次使用DLL_THREAD_ATTACH调用DllMain;就像第3步;