如何使应用程序只运行一个实例 VC

 我来答
huanglenzhi
推荐于2016-04-21 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517189
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部
  关键字: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);
  方法二优点:可以激活旧进程窗口
归悦欣cf
2014-12-09 · TA获得超过1443个赞
知道大有可为答主
回答量:4250
采纳率:59%
帮助的人:1322万
展开全部
这样的代码网上有很多,搜一搜很容易找到。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式