如何在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;
}
答案 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步;