C ++如何检查Outlook进程是否已在运行

时间:2011-04-19 08:53:43

标签: c++ windows

我是C ++编程的新手,但我想知道是否有一种简单的方法可以检查Outlook进程是否已经运行,或者换句话说检查Outlook是否已经打开。

有人能告诉我吗?

由于

4 个答案:

答案 0 :(得分:4)

您可以查看Outlook 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 );
}

如果您调用的应用程序运行在与Outlook不同的用户安全性上下文中,则此代码将不起作用。 最好检查进程名称。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

我假设您使用Windows作为平台,因为Outlook通常在Windows操作系统下运行。

对于简单检查,您可以使用Windows API函数EnumProcesses()和GetModuleBaseName()来确定正在运行的进程的可执行文件名,并检查可执行文件名是否为“outlook.exe”。可以在MSDN中找到函数的参考。

请注意,如果用户运行使用与Outlook相同的可执行文件名的其他程序,则此检查可能会失败。提供的解决方案的另一个陷阱可能是用户对指定API调用所需的访问权限。

改进可能是使用GetFileVersionInfo()来检查可执行文件中的版本信息。

答案 3 :(得分:0)

您可以使用CreateToolhelp32Snapshot并遍历正在运行的进程。如果您需要再次检查Outlook(假设您需要轮询该进程),则保存进程ID并使用OpenProcess(快许多倍)。这个问题的答案中给出了更多细节: Check whether one specific process is running on windows with C++