我是新來的C++編程,但我想知道是否有一種簡單的方法來檢查Outlook進程是否已經運行,或換句話說檢查Outlook是否已經打開。C++如何檢查Outlook進程是否已在運行
任何人都可以告訴我嗎?
感謝
我是新來的C++編程,但我想知道是否有一種簡單的方法來檢查Outlook進程是否已經運行,或換句話說檢查Outlook是否已經打開。C++如何檢查Outlook進程是否已在運行
任何人都可以告訴我嗎?
感謝
我假設你使用的是Windows爲平臺,因爲展望下一個Windows操作系統的正常運行。
對於一個簡單的檢查,您可以使用Windows API函數EnumProcesses()和GetModuleBaseName()來確定正在運行的進程的可執行文件名,並檢查可執行文件名是否爲「outlook.exe」。可以在MSDN中找到這些功能的參考。
請注意,如果用戶運行另一個使用與Outlook相同的可執行文件名的程序,則此檢查可能會失敗。提供的解決方案的另一個陷阱可能是用戶需要用於指定API調用的訪問權限。
改進可能是通過使用GetFileVersionInfo()來檢查可執行文件中的版本信息。
您可以檢查前景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);
}
//////////////////////////////////////////////////////////////////////
// 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;
}
您可以使用CreateToolHelp32Snapshot函數,並通過正在運行的進程進行迭代。如果您需要再次查找Outlook(例如您需要輪詢該進程),則保存進程標識並使用OpenProcess(快許多倍)。更多細節在這個問題的答案中給出: Check whether one specific process is running on windows with C++
你能指定目標操作系統和使用額外的庫/框架(如boost或Qt)的限制嗎? – beduin 2011-04-19 08:57:47
你爲什麼要這樣?一個普遍的答案是「因爲如果不是,我想開始它」。在這種情況下,最初的問題是沒有意義的。只需啓動Outlook。它不會啓動第二個實例。讓它處理像多個用戶帳戶等複雜情況。 – MSalters 2011-04-19 09:18:23
@ MSalters:在我的經驗中,Outlook *不會*啓動新實例,除非使用命令行開關'/ recycle';爲什麼這個開關會存在? – mousio 2011-04-19 22:31:57