我用以下代码想实现在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;
}

解决方案 »

  1.   

    hThread不是0,就说明线程已经创建成功了。你的Start函数应该定义一个指针型参数,但即使没有定义也不会影响执行下面的代码。问题可能与LoadLibrary的进程有关。
      

  2.   

    C/C++程序应该注意一点,不能使用CreateThread创建线程,
    应该使用beginthread 或者beginthreadex创建线程.
      

  3.   

    你可以在beginthread(ex)()前先用SetLastError(0)把任何已经存在的错误清除, 看还有没有错误.另外, 在DllMain中beginthread(ex)并WaitSingleObject是不行的, 你的程序会Hang在那里, 具体原因Jeffery Ritchie的<<Programming Applications for Windows>>中有说明.
      

  4.   

    我刚调试了一下你的程序,问题是WaitForSingleObject时死锁。
    虽然你执行了DisableThreadLibraryCalls,但实际上新的线程还是要Attach这个dll,只是不执行DllMain的代码。我估计Attach操作采取了同步机制,由于进程Attach还没有返回,新的线程Attach被阻塞了。
      

  5.   

    谢谢楼上各位高手了,确实是WaitForSingleObject的问题,但是如果不这样有什么好办法可以及时知道线程是否已经完成了呢?不会要用一个死循环来一直调用GetExitCodeThread吧
      

  6.   

    必须从DllMain中返回后新线程才能运行,所以不能等待线程结束,否则就会死锁。