一个应用程序,如"myapp.exe",我同时运行了多次此程序,如何才能知道程序运行了多少次。请高手指教。

解决方案 »

  1.   

    可以程序每次启动的时候从文件(可以是INI文件也可以是文本文件)中读取一个整数,让这个整数+1,然后再把所得结果写回文件中!一个思路,希望对你有所帮助!
      

  2.   

    to wqs_qiu_shi(美丽心情) and vcforever(霓裳羽衣) :
    是不是程序退出时再让这个值减一? 这样的话,要是程序非正常退出这个值就不对了。
      

  3.   

    运行多少,你只要在app的InitInstance里次数加一,把这个值写到注册表内就可以
      

  4.   

    对,我就想知道当前进程有多少个实例在运行。
    我主要是想保证任何时候只有进程的一个实例在运行。
    在应用程序类CEx1App::InitInstance()中,用CreateMutex函数创建一个互斥量,后调用函数GetLastError()
    如果结果等于ERROR_ALREADY_EXISTS说明已经有一个实例在运行了这时返回FALSE.handle=::CreateMutex(NULL,FALSE,one);//handle为声明的HANDLE类型的全局变量
        if(GetLastError()==ERROR_ALREADY_EXISTS)    
        {    
            AfxMessageBox("应用程序已经在运行");  
            return FALSE;    
        }
    }
      

  5.   

    wqs_qiu_shi(美丽心情) 的方法好
      

  6.   

    wqs_qiu_shi(美丽心情) 的方法好使,
    另外,程序需不需要ReleaseMutex(handle)??
      

  7.   

    回复人: wwhxxx() ( ) 信誉:100  2004-06-24 11:02:00  得分: 0  
     
     
       wqs_qiu_shi(美丽心情) 的方法好使,
    另外,程序需不需要ReleaseMutex(handle)??
      
     
    =================
    当然要在最后的时候释放了.
      

  8.   

    使用ATOM
    在MSDN中查看
    GlboalAddAtom
    GlobalFindAtom
    GlobalDeleteAtom
    你就知道怎么用了
      

  9.   

    方法很多,好像上面的方面都可以,
    不过用mutex方法是最常见的一种
      

  10.   

    呵呵,如果指定一个程序可以有不超过n个实例的情况下CreateMutex就不好使了吧。
    另外,请问zhaolaoxin() 你是怎么混到两颗星的?-----------------------------------------------------------------------
    zhaolaoxin() 
    在程序里放一个静态变量,程序运行时将该变量加一,就可以做一些判断了
    -----------------------------------------------------------------------
      

  11.   

    最简单方便的办法就是使用dll,在里面定义一个int型
    每进入一次+1,退出一次-1
    由于dll由所有同类程序共享,故而随时可以得知当前实例数量
      

  12.   

    我也想知道,在用mutex方法时,如果程序非法退出,是不是还有效?
      

  13.   

    请问NicolasChen(树梢上的风)一个执行文件被运行多份实例不也是共享吗?干嘛还要拐个弯用dll。估计你和zhaolaoxin()都是一个意思吧,用个全局变量来统计运行的实例数吧,但是你们都好像少了个前提条件吧,就是这个变量必须在一个共享段中。
      

  14.   

    建立共享内存文件当然是好办法。
    也有其它很多方法。
    如果程序的名字一样的话,建立一个全局共享变量计数器便可,但程序非法退出记数器未进行减运算就不准了。
    也可以每当程序运行时遍历系统进程,通过进程句柄得到其进程程序的文件名,
    (若不想麻烦就直接比较文件名是否相等)
    再对文件进行CRC效验,CRC效验值和自身文件的CRC效验值相同的大致就是自己程序的一个进程,Number++,直到进程遍历完。
    当然方法很多。好运!
      

  15.   

    //将以下代码加入到App的InitInstance函数内,能实现你的只允许一个实例在运行 HANDLE hSem = CreateSemaphore(NULL, 1, 1, m_pszAppName);  if (GetLastError() == ERROR_ALREADY_EXISTS) 

    CloseHandle(hSem); 
    HWND hWndPrevious = ::GetWindow(::GetDesktopWindow(),GW_CHILD); 
    while (::IsWindow(hWndPrevious)) 

    if (::GetProp(hWndPrevious, m_pszExeName)) 

    if (::IsIconic(hWndPrevious)) 
    ::ShowWindow(hWndPrevious,SW_RESTORE); 

    ::SetForegroundWindow(hWndPrevious);  ::SetForegroundWindow( 
    ::GetLastActivePopup(hWndPrevious));  return FALSE; 

    hWndPrevious = ::GetWindow(hWndPrevious,GW_HWNDNEXT);

    return FALSE; 

      

  16.   

    ablewindy(我是【风子】我怕谁) 的方法有个问题:
    要是我改了可执行文件的文件名,程序就能又运行了!!
    另外,if (::GetProp(hWndPrevious, m_pszExeName)) 好像永远都是false
      

  17.   

    将下面代码加到app的InitInstance函数前
    CString g_strProName = _T("SMS APPLICATION");
    HANDLE  g_hValue = (HANDLE)1;BOOL CALLBACK EnumWndProc(HWND hWnd, LPARAM lParam)
    {
    HANDLE h = GetProp(hWnd, g_strProName);
    if(h == g_hValue)
    {
    *(HWND*)lParam = hWnd; return FALSE;
    }
    else
    {
    return TRUE;
    }}在app的InitInstance函数内加
    HWND oldHWnd = NULL; EnumWindows(EnumWndProc, (LPARAM)&oldHWnd);
    if(oldHWnd != NULL)
    {
    // AfxMessageBox(_T("hello"));
    ShowWindow(oldHWnd, SW_SHOWNORMAL);
    SetForegroundWindow(oldHWnd); return FALSE;
    }
    else
    {
    }