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