windows - C ++ Sådan kontrolleres, om en Outlook-proces allerede kører

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg er ny til C ++ programmering, men jeg vil gerne vide, om der er en nem måde at kontrollere, om en Outlook-proces allerede kører, eller med andre ord, se om Outlook allerede er åbent.


Kan nogen vise mig, tak?


Tak

Bedste reference


Du kan tjekke kørende forekomsten af ​​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 );
}

Andre referencer 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;
}

Andre referencer 2


Jeg går ud fra, at du bruger Windows som platform, da Outlook normalt kører under et Windows OS.


For en simpel kontrol kan du bruge Windows API-funktionerne EnumProcesses () og GetModuleBaseName () til at bestemme det eksekverbare filnavn for de igangværende processer og kontrollere, om det eksekverbare navn er 'outlook.exe'. En reference til funktionerne findes i MSDN. [3]


Vær opmærksom på, at denne check kan mislykkes, hvis brugeren kører et andet program, der bruger det samme eksekverbare filnavn som Outlook. En anden fælde med den leverede løsning kan være adgangsrettighederne en bruger har brug for til de angivne API-opkald.


Forbedringer kan være at kontrollere versionsoplysningerne i den eksekverbare fil også ved at bruge GetFileVersionInfo ().

Andre referencer 3


Du kan bruge CreateToolhelp32Snapshot og iterate gennem løbende processer. Hvis du har brug for at hakke til Outlook igen (sig, du skal afstemme processen), gem derefter proces-id'et og brug OpenProcess (mange gange hurtigere). Flere detaljer er angivet i svaret på dette spørgsmål:
Kontroller, om en bestemt proces kører på Windows med C ++