我是C ++编程的新手,但我想知道是否有一种简单的方法可以检查Outlook进程是否已经运行,或者换句话说检查Outlook是否已经打开。
有人能告诉我吗?
由于
答案 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++