我令程序EXE重启动时,如何确保第二个copy启动时原来的copy所调用的DLL已经完全退出?(内详)
我的EXE调用了DLL,而DLL是一个复杂的多线程SOCKET服务器。所以在退出EXE时,还
要等待DLL退出所有线程。
问题在于,命令EXE重启时,第二个COPY会发现DLL其实并未卸载,从而令SOCKET初始
化失败。
这段代码负责重启动:
if(g_bNeedToRestart)
{
char sz[1000];
memset(sz,0,1000);
GetModuleFileName(NULL,sz,1000);
strcat(sz," /Restart");
::Sleep(1000);
::UnloadDLL();//TRACE表明的确已执行FreeLibrary
::WinExec(sz,SW_SHOW);
}
而这段代码负责判断是否第二个COPY:
if(NULL != strstr(GetCommandLine(),"/Restart"))
{
//MessageBox(sheet,"This is another copy of
application!","",0);
::Sleep(1000);
}
不调用MessageBox就会令DLL里的SOCKET fail to bind,若调用了MessageBox就一切
正常。
只是,重启时跳个MessageBox出来总让我感觉不爽,有无好的解决办法?
我怀疑是WinExec的执行方式有问题,MSDN里说WinExec会等待被启动的进程进入消息循环时才返回。而我希望WinExec不等待而立即返回。换了CreateProcess()和ShellExecute()也一样。