如何保证程序只运行一个实例

cpsoft 2003-12-09 06:35:33
如题
...全文
59 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cyj2008 2003-12-10
  • 打赏
  • 举报
回复
我通常是在运行一个应用程序实例时先创建一个互斥内核对象,如果内核对象已经存在,则说明已经运行了一个应用程序实例,因此退出当前程序。
这和yy315(yy315) 与flyelf(空谷清音)所采用的方法一样
cpsoft 2003-12-10
  • 打赏
  • 举报
回复
我好象还看见过有位大虾的书,好象是说Winmain的几个参数和这个问题有关,好象是hInstance,不知道是不是真的!
北极猩猩 2003-12-09
  • 打赏
  • 举报
回复
我还在一些Java的程序中看到过这样一个保持单个实例运行的方法,在程序第一次开始时打开一个Socket端口,然后在程序启动时连接这一端口,如果端口打开就说明已有一个实例在运行
短歌如风 2003-12-09
  • 打赏
  • 举报
回复
方法1:主窗口的窗口类名取特殊的名字,起动时搜索所有顶层窗口,检查有没有同样类名的窗口。
方法2:主窗口不必有特殊类名,用SetProp设置一个命名性性;起动时搜索所有顶层窗口,用GetProp检查属性。
方法3:起动时创建命名Mutex,如果创建失败并且错误代码表明是对象已经存在则退出。
方法4:起动时打开某一特殊名字的全局原子,如果不存在则创建,否则退出。
方法5:起动时检查注册表中某一固定位置的值,如果是0则把主窗口句柄写到这个位置,在退出时设为0,否则直接退出。
...
总之就是用OS提供的各种全局对象来处理。前两种方法可以得到前一实例的主窗口句柄,在退出时需要通知前一实例时应该用这种方法;3和4不能得到前一实例的主窗口句柄,但比较可靠。方法5比较危险,如果程序非正常退出了,就会导致下一次无法起动。
abitz 2003-12-09
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2497/2497750.xml?temp=6.725711E-02
yy315 2003-12-09
  • 打赏
  • 举报
回复
我通常做法
在APP的InitInstance()函数中加入
例:
HANDLE m_hMutex=CreateMutex(NULL,TRUE, this->m_pszAppName);
if(GetLastError()==ERROR_ALREADY_EXISTS)
{
AfxMessageBox("已存在一个实例!");
return FALSE;
}
cityyokel 2003-12-09
  • 打赏
  • 举报
回复
看看《设计模式》里单件模式吧
神功智能 2003-12-09
  • 打赏
  • 举报
回复
试试这个
http://www.vchome.net/tech/multithread/thread37.htm
flyelf 2003-12-09
  • 打赏
  • 举报
回复
可以用MUTEX来确保
LPCTSTR lpcsMutex = _T("myownmutexname");
m_hMutex = CreateMutex(NULL, NULL, lpcsMutex);
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
AfxMessageBox("已经存在一个实例了");
return
}

sharkhuang 2003-12-09
  • 打赏
  • 举报
回复
static

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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