我用以下代码想实现在DLL_PROCESS_ATTACH中创建一个线程显示一个“fsda”对话框,但是总是不能成功,可是从“err”对话框中可以看到TID,和hThread都不是0,而Getlasterror返回的是14007L,ERROR_SXS_KEY_NOT_FOUND,请问在在DLL_PROCESS_ATTACH中要怎样才能正确调用CreateThread呢?我记得用Delphi时只要在pas文件的initialization部分写CreateThread就可以正常的创建线程了,不知道Delphi的initialization部分和DLL_PROCESS_ATTACH有何关系呢?
DWORD __stdcall Start()
{
MessageBoxA(0,"ok","fsda",0);
return 0;
}BOOL WINAPI DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpvReserved)
{
HANDLE hThread;
char err[20] = {0};
DWORD TID; switch(dwReason)
{
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(hModule);
hInstance = hModule;
{
hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Start,
NULL,0,&TID);
sprintf(err,"Tid:%d,h:%d,err:%d",TID,hThread,GetLastError());
MessageBoxA(0,err,"gad",0);
WaitForSingleObject(hThread,INFINITE);
CloseHandle(hThread);
}
break;
case DLL_PROCESS_DETACH:
break;
default:
break;
}
return TRUE;
}
DWORD __stdcall Start()
{
MessageBoxA(0,"ok","fsda",0);
return 0;
}BOOL WINAPI DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpvReserved)
{
HANDLE hThread;
char err[20] = {0};
DWORD TID; switch(dwReason)
{
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(hModule);
hInstance = hModule;
{
hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Start,
NULL,0,&TID);
sprintf(err,"Tid:%d,h:%d,err:%d",TID,hThread,GetLastError());
MessageBoxA(0,err,"gad",0);
WaitForSingleObject(hThread,INFINITE);
CloseHandle(hThread);
}
break;
case DLL_PROCESS_DETACH:
break;
default:
break;
}
return TRUE;
}
应该使用beginthread 或者beginthreadex创建线程.
虽然你执行了DisableThreadLibraryCalls,但实际上新的线程还是要Attach这个dll,只是不执行DllMain的代码。我估计Attach操作采取了同步机制,由于进程Attach还没有返回,新的线程Attach被阻塞了。