如何实现一个程序只运行一个实例

 我来答
折柳成萌
高粉答主

2017-12-01 · 繁杂信息太多,你要学会辨别
知道顶级答主
回答量:4.4万
采纳率:96%
帮助的人:6316万
展开全部
关键字:VC如何使应用程序只运行一个实例,VC 只运行一次,只给一个程序运行
在开发网络应用程序的时候,由于端口分配和占用问题,经常出现某程序只给运行一个实例的情况.下面就介绍一下,如何使程序就只运行一个实例.

方法一:在应用程序类中使用互斥量
实现步骤:
1.用GUIDGEN.EXE产生一个全局标志,#define PROC_ID "产生的全局标志"
如本实例:#define PROC_ID "0xa9a66d98, 0x18c7, 0x447b, 0x80, 0xc, 0xa3, 0x20, 0xea, 0x4f, 0xb6, 0xe8" //注:GUIDGEN.EXE为VC自带工具,如果在开始->程序的Microsoft Visual C++ 6.0 Tools里找不到该程序可以到C:\Program Files\Microsoft Visual Studio\Common\Tools里找到.
//注:用此方法生成的串,只为保证该进程标识的唯一性,也可以自己定一个简单的串标识
2.
BOOL CEx1App::InitInstance()
{
handle=::CreateMutex(NULL,FALSE,PROC_ID);//handle为声明的HANDLE类型的全局变量
if(GetLastError()==ERROR_ALREADY_EXISTS)
{
AfxMessageBox("应用程序已经在运行");
return FALSE;
}
......................//略
}
3.
在XXApp类里右件,添加ExitInstance虚函数:(函数里语句如下即可)
int CEx1App::ExitInstance()
{
CloseHandle(handle);
return CWinApp::ExitInstance();
}
///缺点:无法击活旧窗口

方法二:枚举进程法
#define ID_GUI "0xa9a66d98, 0x18c7, 0x447b, 0x80, 0xc, 0xa3, 0x20, 0xea, 0x4f, 0xb6, 0xe8"//Guidgen.exe生成保证唯一性

//添加的标识只运行一次的属性名
CString g_szPropName = ID_GUI;?? //全局变量
HANDLE g_hValue = (HANDLE)1; //全局变量
//添加一个枚举窗口的函数
BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam)
{
HANDLE h = GetProp(hwnd,g_szPropName);
if( h == g_hValue)
{
?? *(HWND*)lParam = hwnd;
?? return false;
}
return true;
}

BOOL CRunOnceApp::InitInstance()
{
?? //查找是否有本程序的前一个实例运行
HWND oldHWnd = NULL;
EnumWindows(EnumWndProc,(LPARAM)&oldHWnd); //枚举所有运行的窗口
if(oldHWnd != NULL)
{
?? AfxMessageBox("本程序已经在运行了");
?? ::ShowWindow(oldHWnd,SW_SHOWNORMAL);??? //激活找到的前一个程序
?? ::SetForegroundWindow(oldHWnd);?? //把它设为前景窗口
?? return false;??????? //退出本次运行
}
................//略
}
在XXDlg.cpp页
//声明全局变量
extern CString g_szPropName;
extern HANDLE g_hValue;

在主窗口的 OnInitDialog()中添加属性
//设置窗口属性
SetProp(m_hWnd,g_szPropName,g_hValue);
方法二优点:可以激活旧进程窗口
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式