2011-04-19 93 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; 
} 
相关问题