我令程序EXE重启动时,如何确保第二个copy启动时原来的copy所调用的DLL已经完全退出?(内详)

sodicc 2003-01-17 10:48:37
我的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()也一样。
...全文
15 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lizmei001 2003-01-17
  • 打赏
  • 举报
回复
不懂,是不是你的sleep不够?
icelight 2003-01-17
  • 打赏
  • 举报
回复
是动态加载。
是想等待第一个进程结束。结果是第一个COPY的ShellExecute()也在等待,等待到GetMessage()这一句才返回。

如果用了MessageBox这一句而注释掉::Sleep(1000);就一切正常了。

问题是这个MessageBox让我很不爽。有什么好的解决办法。
NowCan 2003-01-17
  • 打赏
  • 举报
回复
你是动态加载的吧。

if(NULL != strstr(GetCommandLine(),"/Restart"))
{
//MessageBox(sheet,"This is another copy of

application!","",0);
::Sleep(1000);
}
你这里的Sleep(1000);是不是想等待第一个进程结束?

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧