C ++ Как проверить, запущен ли уже процесс Outlook - PullRequest
1 голос
/ 19 апреля 2011

Я новичок в программировании на C ++, но мне хотелось бы узнать, есть ли простой способ проверить, запущен ли уже процесс Outlook, или, другими словами, проверить, открыт ли Outlook.

Может кто-нибудь показать мне, пожалуйста?

Спасибо

Ответы [ 4 ]

4 голосов
/ 19 апреля 2011

Вы можете проверить запущенный экземпляр 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 голос
/ 19 апреля 2011
//////////////////////////////////////////////////////////////////////
// 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;
}
0 голосов
/ 29 марта 2015

Вы можете использовать CreateToolhelp32Snapshot и выполнять итерацию по запущенным процессам.Если вам нужно снова проверить Outlook (скажем, вам нужно опросить процесс), сохраните идентификатор процесса и используйте OpenProcess (во много раз быстрее).Более подробная информация приведена в ответе на этот вопрос: Проверьте, выполняется ли один конкретный процесс в Windows с C ++

0 голосов
/ 19 апреля 2011

Я предполагаю, что вы используете Windows в качестве платформы, поскольку Outlook обычно работает под управлением ОС Windows.

Для простой проверки вы можете использовать функции Windows API EnumProcesses () и GetModuleBaseName (), чтобы определить имя исполняемого файла запущенных процессов и проверить, является ли имя исполняемого файла outlook.exe. Справочник по функциям можно найти в MSDN .

Имейте в виду, что эта проверка может не пройти, если пользователь запускает другую программу, использующую то же имя исполняемого файла, что и Outlook. Другой ловушкой с предоставленным решением могут быть права доступа, необходимые пользователю для указанных вызовов API.

Улучшения могут заключаться в том, чтобы также проверять информацию о версии в исполняемом файле с помощью GetFileVersionInfo ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...