2011-04-19 96 views
1

我是新來的C++編程,但我想知道是否有一種簡單的方法來檢查Outlook進程是否已經運行,或換句話說檢查Outlook是否已經打開。C++如何檢查Outlook進程是否已在運行

任何人都可以告訴我嗎?

感謝

+0

你能指定目標操作系統和使用額外的庫/框架(如boost或Qt)的限制嗎? – beduin 2011-04-19 08:57:47

+0

你爲什麼要這樣?一個普遍的答案是「因爲如果不是,我想開始它」。在這種情況下,最初的問題是沒有意義的。只需啓動Outlook。它不會啓動第二個實例。讓它處理像多個用戶帳戶等複雜情況。 – MSalters 2011-04-19 09:18:23

+0

@ MSalters:在我的經驗中,Outlook *不會*啓動新實例,除非使用命令行開關'/ recycle';爲什麼這個開關會存在? – mousio 2011-04-19 22:31:57

回答

0

我假設你使用的是Windows爲平臺,因爲展望下一個Windows操作系統的正常運行。

對於一個簡單的檢查,您可以使用Windows API函數EnumProcesses()和GetModuleBaseName()來確定正在運行的進程的可執行文件名,並檢查可執行文件名是否爲「outlook.exe」。可以在MSDN中找到這些功能的參考。

請注意,如果用戶運行另一個使用與Outlook相同的可執行文件名的程序,則此檢查可能會失敗。提供的解決方案的另一個陷阱可能是用戶需要用於指定API調用的訪問權限。

改進可能是通過使用GetFileVersionInfo()來檢查可執行文件中的版本信息。

4

您可以檢查前景OLE的運行例如:

static const bool isOutlookRunning() 
{ 
    CLSID clsid; 
    HRESULT hr = CLSIDFromProgID(_T("Outlook.Application"), &clsid); 
    if(hr != S_OK) return false; 

    IUnknown *pUnknown = NULL; 
    hr = GetActiveObject(clsid, 0, &pUnknown); 
    return (hr == S_OK); 
} 
1
////////////////////////////////////////////////////////////////////// 
// IsProcessRunning 
////////////////////////////////////////////////////////////////////// 
bool IsProcessRunning(string &strProcessFullPathName) 
{ 
    // Get the list of process identifiers. 
    DWORD dwProcesses[2048]; 

    DWORD dwSizeNeeded = 0; 
    DWORD dwProcessesCount = 0; 

    if (!EnumProcesses(dwProcesses, sizeof(dwProcesses), &dwSizeNeeded)) 
    { 
     _dwLastErrorCode = GetLastError(); 
     _strLastError = "EnumProcesses";   
     return false; 
    } 

    dwProcessesCount = dwSizeNeeded/sizeof(DWORD); 


    string strToCheck = strProcessFullPathName; 
    transform(strToCheck.begin(), strToCheck.end(), strToCheck.begin(), tolower); 

    for(int i=0; i<(int)dwProcessesCount; i++) 
    { 
     if(dwProcesses[i] != 0) 
     {     
      HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcesses[i]); 
      if(hProcess) 
      { 
       HMODULE hModule = NULL; 
       dwSizeNeeded = 0; 
       char cName[MAX_PATH]; 
       if(EnumProcessModules(hProcess, &hModule, sizeof(DWORD), &dwSizeNeeded)) 
       { 
        if(GetModuleFileNameEx(hProcess, hModule, cName, MAX_PATH) != 0) 
        { 
         string strName(cName); 
         // Convert to LowerCase 
         transform(strName.begin(), strName.end(), strName.begin(), tolower); 

         if(strName == strToCheck) 
         { 
          CloseHandle(hProcess); 
          return true; 
         } 
        } 
       } 

       CloseHandle(hProcess); 
      }    
     } 
    } 


    return false; 
} 
相關問題