-
September 20th, 2010, 02:26 AM
#1
How To Get Path of other Exe file in my MFC Code
Hi,
I have one .Net Exe file when i click on that i need to get path of that Exe in My MFC code,how can i get this ,please help me on this.
Thanks
Abhi
-
September 20th, 2010, 04:59 AM
#2
Re: How To Get Path of other Exe file in my MFC Code
There are several ways to get a process path (different by the calling one) but no one is simple.
Here is an example using WMI (Windows Management Instrumentation):
Code:
#include <wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
#pragma comment(lib, "comsuppw.lib")
HRESULT CProcHelper::GetProcessPath(const CStringW& strExeFile, CStringW& strPath, BOOL& bFound)
{
// NOTE: don't forget a call to AfxOleInit in InitInstance of application class.
bFound = FALSE;
// initialize the IWbemLocator interface
IWbemLocator *pLoc = NULL;
HRESULT hr = CoCreateInstance(CLSID_WbemLocator, NULL,
CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc);
if(FAILED(hr))
{
return hr;
}
// create a connection to WMI namespace.
IWbemServices *pSvc = NULL;
hr = pLoc->ConnectServer(bstr_t("ROOT\\CIMV2"),
NULL, NULL, 0, NULL, 0, 0, &pSvc);
if(FAILED(hr))
{
pLoc->Release();
return hr;
}
// set security levels on the proxy
hr = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE,
NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
if(FAILED(hr))
{
pSvc->Release();
pLoc->Release();
return hr;
}
// do query
IEnumWbemClassObject* pEnum = NULL;
hr = pSvc->ExecQuery(bstr_t("WQL"),
bstr_t("SELECT Name, ExecutablePath FROM Win32_Process"),
WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnum);
if(FAILED(hr))
{
pSvc->Release();
pLoc->Release();
return hr;
}
// get each processes enumeration
IWbemClassObject *pclsObj;
ULONG uReturn = 0;
while(pEnum)
{
pEnum->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
if(0 == uReturn)
break;
// get properties values
VARIANT vtName;
pclsObj->Get(L"Name", 0, &vtName, 0, 0);
if(!strExeFile.CompareNoCase(vtName.bstrVal))
{
VARIANT vtExecutablePath;
pclsObj->Get(L"ExecutablePath", 0, &vtExecutablePath, 0, 0);
strPath = vtExecutablePath.bstrVal;
VariantClear(&vtExecutablePath);
bFound = TRUE; // successfully found
break;
}
VariantClear(&vtName);
}
// cleanup
pclsObj->Release();
pEnum->Release();
pSvc->Release();
pLoc->Release();
return hr;
}
And here is a usage example:
Code:
void CMyDialog::OnBnClickedShowSomeProcesPath()
{
CString strPath;
BOOL bFound = FALSE;
CString strResult;
LPCTSTR pszExeFile = _T("some_executable.exe");
HRESULT hr = CProcHelper::GetProcessPath(pszExeFile, strPath, bFound);
if(FAILED(hr))
{
strResult.Format(_T("GetProcessPath failed\nError: %08x"), hr);
}
else if(! bFound)
{
strResult.Format(_T("Process '%s' not found"), pszExeFile);
}
else
{
strResult.Format(_T("%s path is '%s'"), pszExeFile, strPath);
}
AfxMessageBox(strResult);
}
Last edited by ovidiucucu; September 20th, 2010 at 10:46 AM.
-
September 20th, 2010, 09:10 AM
#3
Re: How To Get Path of other Exe file in my MFC Code
Thank You.
Dont we have any Library Function to get the Path.
Cant I achieve it using GetModuleName and GetModuleFileName ?
-Abhi
-
September 20th, 2010, 09:49 AM
#4
Re: How To Get Path of other Exe file in my MFC Code
Originally Posted by AbhiMFC
Thank You.
Dont we have any Library Function to get the Path.
Cant I achieve it using GetModuleName and GetModuleFileName ?
-Abhi
For the GetModuleFileName you would need HMODULE handle of the executable. That you can retrieve by calling EnumProcessModules where you need a handle of the process associated with the executable. The process handle is returned when calling OpenProcess with mode PROCESS_QUERY_INFORMATION and input of the process ID. The process ID you can get by EnumProcesses if you know the name of the process.
If you only know the windows caption of the application but not the processname you can call EmumWindows or FindWindow to retrieve the windows handle of the main window. Then call GetWindowModuleFileName to retrieve path of executable.
-
September 20th, 2010, 10:30 AM
#5
Re: How To Get Path of other Exe file in my MFC Code
Originally Posted by AbhiMFC
Dont we have any Library Function to get the Path.
AFAIK there is no Windows API function to directly retrieve the full path given the executable/process (other than caller process) name.
Here is another example using PSAPI (Process Status API) functions EnumProcesses, GetModuleBaseName, and GetModuleFileNameEx:
Code:
#include <Psapi.h>
#pragma comment(lib, "Psapi.lib")
BOOL GetProcessPath(LPCTSTR pszExeFile, CString& strPath)
{
BOOL bFound = FALSE;
const DWORD cb = 1024; // assume enough
DWORD dwBytesReturned = 0;
DWORD dwIDs[cb];
if(::EnumProcesses(dwIDs, cb, &dwBytesReturned))
{
size_t size = dwBytesReturned / sizeof(DWORD);
CString strBaseName;
const DWORD dwSize = MAX_PATH + 1;
for(size_t index = 0; index < size; index++)
{
HANDLE hProcess = ::OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,
FALSE, dwIDs[index]);
::GetModuleBaseName(hProcess, NULL,
strBaseName.GetBufferSetLength(dwSize), dwSize);
strBaseName.ReleaseBuffer();
if(!strBaseName.CompareNoCase(pszExeFile))
{
::GetModuleFileNameEx(hProcess, NULL,
strPath.GetBufferSetLength(dwSize), dwSize);
bFound = TRUE;
}
::CloseHandle(hProcess);
}
}
return bFound;
}
Not so much sweat like in case of using WMI, but sweat a little...
Last edited by ovidiucucu; September 20th, 2010 at 10:45 AM.
Reason: typo
-
September 21st, 2010, 05:17 AM
#6
Re: How To Get Path of other Exe file in my MFC Code
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|