发信人: tsingxiao() 
整理人: wenbobo(2002-12-06 23:12:36), 站内信件
 | 
 
 
WIN16程序中,通过检查WinMain(... HINSTANCE hinstExecPrev) 的值来确定是否已经有程序的另一个实例正在运行 if (hinstExecPrev == NULL) {   // no previous running } else {   // already running }
  在Win32下,上述方法失效,原因是: WIn32传给hinstExecPrev的永远是 NULL。解决方法: 1) 用::FindWindow()查找窗口标题或者窗口类,如果返回NULL表示没有该程 序的实例在运行。这种方法有个弊端:很多程序的TOPIC是改变的,事先无 法准确获知。
  2) 设法在同一个程序的所有实例中共享一个全局变量,每次程序启动时只要检 查该变量的值就可以知道有多少个实例在运行中。
  #pragma data_seg("Shared") LONG g_iUsageCount = -1; #pragma data_seg()
  #pragma comment(linker, "/section:Shared,rws")
  ...
  WinMain(...) {  BOOL fFirstInst = (InterlockedIncrement(&g_iUsageCount) == 0);
  ...  if (!fFirstInst) {  // already running  } else {  // first time running }  InterlockedDecrement(&g_iUsageCount);  return 0; }
  -- 我   既不能达而兼善天下                     只好穷而独善自身   青山处处  斯民如土矣……
  ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.101.3.150] ====================================================================== 发信人: tjam (tjam), 信区: CLanguage 标  题: Re: 判别一个应用程序是否已经运行中的方法 发信站: 网易虚拟社区 (Sun Aug 22 19:01:42 1999), 站内信件 【 在 tsingxiao (脑袋) 的大作中提到: 】 : WIN16程序中,通过检查WinMain(... HINSTANCE hinstExecPrev) : 的值来确定是否已经有程序的另一个实例正在运行 : if (hinstExecPrev == NULL) { :   // no previous running :    ....... Windows Topic虽然会变,但你只要::RegisterClass一下,就可以调用 ::FindWindow("XXXX",NULL)这样无论Title怎样变化,注册过的class总 能找到的而且是唯一的. For example: BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying //  the CREATESTRUCT cs     WNDCLASS m_class;     BOOL bRes = CMDIFrameWnd::PreCreateWindow(cs);     HINSTANCE hInst = AfxGetInstanceHandle();         if (!::GetClassInfo(hInst, "JmailClass", &m_class))         {            ::GetClassInfo(hInst, cs.lpszClass, &m_class);            m_class.lpszClassName = "JmailClass";            m_class.hIcon = ::LoadIcon(hInst, MAKEINTRESOURCE(IDR_MAINF RAME));            ::RegisterClass(&m_class);         }         // see if the class already exists         cs.lpszClass = "JmailClass";         return bRes; } 再在CxxApp里的InitInstance()写 if (::FindWindow("JmailClass",NULL)!=NULL) {         AfxMessageBox(_T("Jmail 已经运行!"));         return FALSE; } -- --   \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ^v^ Name:James Tan                ^o^ ^v^ E-mail:[email protected]  ^o^ ^v^ URL:http://yam.cccc.com/~sst/ ^o^  \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.101.14.205]
 
  ============================================================================== 发信人: wenbobo (Sirius), 信区: CLanguage 标  题: Re: 判别一个应用程序是否已经运行中的方法 发信站: 网易虚拟社区 (Sun Aug 22 19:56:00 1999), 站内信件 【 在 tsingxiao (脑袋) 的大作中提到: 】 : WIN16程序中,通过检查WinMain(... HINSTANCE hinstExecPrev) : 的值来确定是否已经有程序的另一个实例正在运行 : if (hinstExecPrev == NULL) { :   // no previous running :    ....... 不彻底不彻底……我的方法是: 1.取得自己的路径文件名 2.使用tool help函数CreateToolhelp32Snapshot,Process32First,   Process32Next...查找找同样名字的process 3.没有什么可说的了.找到了几个说明有几个实例... -- 苍天不公,为何我不是--                      高个文静的男孩 ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.104.163.218]
 
 
  | 
 
 
 |