星期日, 5月 04, 2014

[程式] 讓程式只存在一個執行實體

1. 首先利用 CreateMutex 建立互斥實體
HANDLE hExistMutex = CreateMutex(NULL,FALSE,"Exist_Mutex");

2. 然後用 GetLastError 檢查回傳直是否等於 ERROR_ALREADY_EXISTS

3. 若相等就中止目前執行程序:
        HANDLE hself = GetCurrentProcess();
        TerminateProcess(hself, 0);

4. 或是利用以下函式關閉前一個執行實體:

void CloseProgram(CString strProgram)
{
    HANDLE handle; //定義CreateToolhelp32Snapshot系統快照句柄
    HANDLE handle1; //定義要結束進程句柄
    handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//獲得系統快照句柄
    PROCESSENTRY32 *info; //定義PROCESSENTRY32結構字指
    //PROCESSENTRY32 結構的 dwSize 成員設置成 sizeof(PROCESSENTRY32)
   
    info = new PROCESSENTRY32;
    info->dwSize = sizeof(PROCESSENTRY32);
    //調用一次 Process32First 函數,從快照中獲取進程列表
    Process32First(handle, info);
    //重複調用 Process32Next,直到函數返回 FALSE 為止
    DWORD curProcessID = GetCurrentProcessId();
    while(Process32Next(handle, info) != FALSE )
    { 
        if(info->th32ProcessID == curProcessID)
        {
            continue;
        }

        CString strTmp = info->szExeFile;     //指向進程名字 
        //strcmp字符串比較函數同要結束相同 
        //if(strcmp(c, info->szExeFile) == 0 ) 
        if (strProgram.CompareNoCase(info->szExeFile) == 0 ) 
        { 
            //PROCESS_TERMINATE表示為結束操作打開,FALSE=可繼承,info->th32ProcessID=進程ID  
            handle1 = OpenProcess(PROCESS_TERMINATE, FALSE, info->th32ProcessID);
            //結束進程  
            TerminateProcess(handle1, 0);  
        } 
    }
    delete info;
    CloseHandle(handle);
}