如何使程序只能启动一个呢? 就是应用程序启动一个后,防止这个程序再次被启动?怎么做呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 程序只运行一个实例,并激活前一个实例http://www.vckbase.com/document/viewdoc.asp?id=672 在 XXXXApp::InitInstance()里加入: HANDLE m_hMutex=CreateMutex(NULL,TRUE, m_pszAppName); if(GetLastError()==ERROR_ALREADY_EXISTS) { return FALSE; } http://www.vckbase.com/document/listdoc.asp?mclsid=13&sclsid=1305 我总结了以下3种方法,第四种还没有完成,你参考参考吧:1. 使用命名互斥对象:(其实质是创建一个仅能运行一次的以字符串命名的系统级变量)HANDLE hObject;int CMessageSendApp::ExitInstance() {hObject =::CreateMutex(NULL,FALSE, "one"); if(GetLastError()==ERROR_ALREADY_EXISTS) { CloseHandle(hObject); AfxMessageBox("应用程序已经在运行"); return FALSE; }}int CMessageSendApp::ExitInstance() {CloseHandle(hObject); return CWinApp::ExitInstance();}2. 进程间发送消息:UINT wm_die;InitInstance()中:HWND hWnd = m_pMainWnd->m_hWnd; wm_die = ::RegisterWindowMessage ("WM_DIE"); ::PostMessage(HWND_BROADCAST, wm_die, (WPARAM)(hWnd), 0);PreTranslateMessage()中:if(pMsg->message == wm_die) { if((HWND)(pMsg->wParam) != m_pMainWnd->m_hWnd) { AfxMessageBox("不能有两个程序实例同时运行", MB_OK, 0); ::SendMessage((HWND)(pMsg->wParam), WM_SYSCOMMAND, SC_CLOSE, 0); } }说明:如果是同一个进程,那么参数wParam和当前的主窗口句柄m_pMainWnd->m_hWnd相同。3. 用一个系统级全局变量:在.cpp文件开头加上以下几行: #pragma data_seg("Shared") int volatile g_lAppInstance =0;#pragma data_seg()我们来看一下上面的内容:第一句 #pragma data_seg("Shared") 创建一个称为Shared 的新节。第二句 int volatile g_lAppInstance =0 将 g_lAppInstance 放入Shared节中。注意此时只有将g_lAppInstance初始化,编译器才会将其放入Shared节中,否则,将放入Shared以外的节。(实际上Visual C++ 编译器提供了一个allocate 说明符,使我们可以将数据放到任何节中。)第三句指示编译器Shared 节结束。 #pragma comment(linker,"/section:Shared,RWS")这一句,我们使编译链接器知道我们的Shared节具有读,写,共享的属性。这是我们实现互斥运行的关键。这样我们就可以在应用程序之间的多个实例之间共享g_lAppInstance 变量。要注意section:后面必须和data_seg("Shared")引号里的名字一样。在InitInstance() 函数中加入: if(++g_lAppInstance>1){ AfxMessageBox("程序已经运行!"); return FALSE;}以上代码的作用是在程序是开始对g_lAppInstancd 加1 ,如果发现其值大于1,那么显示Message Box ,并返回FALSE。(注意:在MFC中如果InitInstance返回FALSE,程序将不会被运行!)4. 用信号灯 zhang_dq(虾米) 这位高人的办法比较简单 标题这行汉字改成Video//怎么改? HOOK,DLL新手阿新手。。。有问题。。。 调试Filter时提示Invalid Directory 基于视频的图像处理框架 多接口问题请教 请教高手--怎样把多个位图存入一个新文件中去 高手帮忙,困扰我4天的问题了,我找了所有网站,还是没有答案。 在c++的MFC中增加datagrid的列 IE屏了右键怎么处理?。。。。。。。。。。。。。。 为什么我定义的类没有调用析构函数? 数据库访问过程中出现:试图越过数据的有效存储区间 子线程中的CHttpFile ->SendRequest()函数问题。
HANDLE m_hMutex=CreateMutex(NULL,TRUE, m_pszAppName);
if(GetLastError()==ERROR_ALREADY_EXISTS) { return FALSE; }
1. 使用命名互斥对象:(其实质是创建一个仅能运行一次的以字符串命名的系统级变量)
HANDLE hObject;
int CMessageSendApp::ExitInstance()
{
hObject =::CreateMutex(NULL,FALSE, "one");
if(GetLastError()==ERROR_ALREADY_EXISTS)
{
CloseHandle(hObject);
AfxMessageBox("应用程序已经在运行");
return FALSE;
}
}int CMessageSendApp::ExitInstance()
{
CloseHandle(hObject);
return CWinApp::ExitInstance();
}
2. 进程间发送消息:
UINT wm_die;
InitInstance()中:
HWND hWnd = m_pMainWnd->m_hWnd;
wm_die = ::RegisterWindowMessage ("WM_DIE");
::PostMessage(HWND_BROADCAST, wm_die, (WPARAM)(hWnd), 0);
PreTranslateMessage()中:
if(pMsg->message == wm_die)
{
if((HWND)(pMsg->wParam) != m_pMainWnd->m_hWnd)
{
AfxMessageBox("不能有两个程序实例同时运行", MB_OK, 0);
::SendMessage((HWND)(pMsg->wParam), WM_SYSCOMMAND, SC_CLOSE, 0);
}
}
说明:如果是同一个进程,那么参数wParam和当前的主窗口句柄m_pMainWnd->m_hWnd相同。3. 用一个系统级全局变量:
在.cpp文件开头加上以下几行:
#pragma data_seg("Shared")
int volatile g_lAppInstance =0;
#pragma data_seg()我们来看一下上面的内容:
第一句 #pragma data_seg("Shared") 创建一个称为Shared 的新节。
第二句 int volatile g_lAppInstance =0 将 g_lAppInstance 放入Shared节中。注意此时只有将g_lAppInstance初始化,编译器才会将其放入Shared节中,否则,将放入Shared以外的节。(实际上Visual C++ 编译器提供了一个allocate 说明符,使我们可以将数据放到任何节中。)
第三句指示编译器Shared 节结束。
#pragma comment(linker,"/section:Shared,RWS")
这一句,我们使编译链接器知道我们的Shared节具有读,写,共享的属性。这是我们实现互斥运行的关键。这样我们就可以在应用程序之间的多个实例之间共享g_lAppInstance 变量。要注意section:后面必须和data_seg("Shared")引号里的名字一样。
在InitInstance() 函数中加入:
if(++g_lAppInstance>1)
{
AfxMessageBox("程序已经运行!");
return FALSE;
}
以上代码的作用是在程序是开始对g_lAppInstancd 加1 ,如果发现其值大于1,那么显示Message Box ,并返回FALSE。(注意:在MFC中如果InitInstance返回FALSE,程序将不会被运行!)4. 用信号灯