用MFC写了一个采集软件,现在的问题是,多次点击release文件后会运行好几个同样的软件,而现在要求在已经打开一个当前软件的情况下,再去点击它就不让打开了,就是一台电脑只能控制它运行一个我们的软件,不允许同时开多个。
之前在配置文件里加了一个变量控制,但是这样很不安全,因为配置文件是可写的

解决方案 »

  1.   

    #include <Windows.h>int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
    {TCHAR strAppName[] = TEXT("OnlyOne");
    HANDLE hMutex = NULL;//创建互斥对象
    hMutex = CreateMutex(NULL, FALSE, strAppName);
    if (hMutex != NULL)
    {
    if (GetLastError() == ERROR_ALREADY_EXISTS)
    {
    MessageBox(NULL,TEXT("不是第一次运行这个程序。"),TEXT("OnlyOne"),MB_OK | MB_ICONINFORMATION);
    //关闭互斥对象,退出程序
    CloseHandle(hMutex);
    return (-1);
    } else
    {
    MessageBox(NULL,TEXT("第一次运行这个程序。"),TEXT("OnlyOne"),MB_OK | MB_ICONINFORMATION);
    }
    } else
    {
    MessageBox(NULL,TEXT("创建互斥对象失败。"),TEXT("OnlyOne"),MB_OK | MB_ICONINFORMATION);
    }
    //关闭互斥对象
    CloseHandle(hMutex);
    return (-1);}
      

  2.   

    CreateMutex创建互斥量就行了。
    HANDLE hMutex = NULL; 
     
    hMutex = CreateMutex(NULL, FALSE, strAppName); 
    if (hMutex != NULL) 

    if (GetLastError() == ERROR_ALREADY_EXISTS) 

       PostQuitMessage(0);
    }
    }
      

  3.   

    m_hMutex   =   CreateMutex   (NULL,   TRUE,   strClassName)  ; 
    if (m_hMutex)
    {
    if (ERROR_ALREADY_EXISTS == GetLastError())
    {
    IsFirst = FALSE;
    ReleaseMutex(m_hMutex);
    CloseHandle(m_hMutex);
    }else
    {
    IsFirst = TRUE;
    m_myhandle = m_hMutex;
    }
    }
      

  4.   

    Use the CloseHandle function to close the handle. The system closes the handle automatically when the process terminates. The mutex object is destroyed when its last handle has been closed. 注意:不使用mutex对象时需要调用CloseHandle关闭。
      

  5.   

    我的实现方法: 
    别忘了退出的时候关闭hMutexStep 1:
    CPro01App类中定义如下:
    public:
    HANDLE hMutex;step 2:
    BOOL CPro01App::InitInstance()
    {
       ;;;;;;;
     
        hMutex = CreateMutex(NULL, FALSE, "EnglishPro7_CET4");
    if(hMutex == NULL || ERROR_ALREADY_EXISTS==::GetLastError())
    {
    //AfxMessageBox(" 程序已经运行或正在清理数据! 按\"确定\"强制退出!");
    exit(0);
    }
    }Step 3:
    int CPro01App::ExitInstance() 
    {
    ::CloseHandle(hMutex);
    hMutex = NULL;
    }
      
      

  6.   

    HANDLE hMutex= NULL; hMutex= CreateMutex(NULL, FALSE, strAppName);if (hMutex!= NULL) 
    {if (GetLastError()== ERROR_ALREADY_EXISTS) 
    {
       return FALSE; 
    }