⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_59768.htm

📁 vc
💻 HTM
字号:
<p>
序号:59768 发表者:robslove 发表日期:2003-11-10 13:02:48
<br>主题:如何让自己的程序只执行一次
<br>内容:这是我翻以前帖子的内容<BR>在InitInstance()中加入<BR>if(AlreadyRunning())<BR>&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AfxMessageBox(IDS_ALREADY_RUNNING,MB_OK|MB_ICONWARNING);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(FALSE);<BR>&nbsp;&nbsp; }<BR><BR><BR><BR><BR><BR>BOOL C***App::AlreadyRunning()<BR>{<BR>&nbsp;&nbsp; BOOL bFound = FALSE;<BR><BR>&nbsp;&nbsp; // Try to create a mutex with the app's name<BR>&nbsp;&nbsp; HANDLE hMutexOneInstance = ::CreateMutex(NULL,TRUE,_T(AfxGetAppName()));<BR><BR>&nbsp;&nbsp; // Already there...means that we are already running an instance<BR>&nbsp;&nbsp; if(::GetLastError() == ERROR_ALREADY_EXISTS)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bFound = TRUE;<BR><BR>&nbsp;&nbsp; // Release the mutex<BR>&nbsp;&nbsp; if(hMutexOneInstance)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::ReleaseMutex(hMutexOneInstance);<BR><BR>&nbsp;&nbsp; return(bFound);<BR>} <BR>程序虽然会弹出提示已经运行<BR>但仍会重复运行<BR>不知道怎么回事
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:樂日華 回复日期:2003-11-10 13:08:45
<br>内容:InitInstance()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;AfxEnableControlContainer();<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//保證程序只能夠同時運行一個 <BR>&nbsp;&nbsp;&nbsp;&nbsp;HANDLE m_hMutex=CreateMutex(NULL,TRUE, m_pszAppName); <BR>&nbsp;&nbsp;&nbsp;&nbsp;if(GetLastError()==ERROR_ALREADY_EXISTS) { return FALSE; }<BR><BR><BR><BR>}
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:iwill 回复日期:2003-11-10 13:11:04
<br>内容:看清楚了 是App类的InitInstance 不是dialog的OnInitDialog,如果非要在后者中实现,应该是SendMessage(WM_CLOSE);
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:浪际天涯 回复日期:2003-11-10 14:34:19
<br>内容:&nbsp;&nbsp;&nbsp;&nbsp;HANDLE hObject = CreateMutex(NULL,FALSE,&#34;TEST&#34;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(GetLastError() == ERROR_ALREADY_EXISTS)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(hObject);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AfxMessageBox(&#34;程序已经运行!&#34;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return FALSE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:浪际天涯 回复日期:2003-11-10 14:37:04
<br>内容:另一种方法:<BR><BR>在CMyApp.cpp文件开头加上以下几行:<BR>#pragma data_seg(&#34;Shared&#34;)&nbsp;&nbsp;&nbsp;&nbsp; <BR>int volatile g_lAppInstance =0;<BR>#pragma data_seg()<BR><BR>我们来看一下上面的内容:<BR>第一句 #pragma data_seg(&#34;Shared&#34;) 创建一个称为Shared 的新节。<BR>第二句 int volatile g_lAppInstance =0 将 g_lAppInstance 放入Shared节中。注意此时只有将g_lAppInstance初始化,编译器才会将其放入Shared节中,否则,将放入Shared以外的节。(实际上Visual C++ 编译器提供了一个allocate 说明符,使我们可以将数据放到任何节中。)<BR>第三句指示编译器Shared 节结束。<BR><BR>#pragma comment(linker,&#34;/section:Shared,RWS&#34;)<BR><BR>这一句,我们使编译链接器知道我们的Shared节具有读,写,共享的属性。这是我们实现互斥运行的关键。这样我们就可以在应用程序之间的多个实例之间共享g_lAppInstance 变量。<BR>在InitInstance() 函数中加入:<BR>if(++g_lAppInstance&gt;1)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;AfxMessageBox(&#34;程序已经运行!&#34;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;return FALSE;<BR>}<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:无情阁东雪 回复日期:2003-11-10 16:15:17
<br>内容:呵呵,你翻出的帖子不就是我写的吗!<BR>按照我说的做是绝对没错的,记住,是在APP类中加,别搞错了!!!!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -