GetModuleFileName() 函数返回当前进程已加载可执行或DLL文件的完整路径名(以'\0'终止),该模块必须由当前进程地址空间加载。如果想要获取另一个已加载模块的文件路径,可以使用GetModuleFileNameEx()函数。
DWORD WINAPI GetModuleFileName( //失败返回0;
_In_opt_ HMODULE hModule, //应用程序或DLL实例句柄,NULL则为获取当前程序可执行文件路径名
_Out_ LPTSTR lpFilename, //接收路径的字符串缓冲区
_In_ DWORD nSize //接收路径的字符缓冲区的大小
);
CString strExePath; CString strPath; GetModuleFileName(NULL,strPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH+1); AfxMessageBox(strPath);//"c:\Programe Files\Google\abc.exe" int nPos = strPath.ReverseFind(_T('\\')); strExePath = strPath.Left(nPos+1); AfxMessageBox(strExePath);//"c:\Program Files\Google\"
DWORD GetModuleFileNameEx( //失败返回0;要包含Psapi.h头文件,并链接到Psapi.lib;
HANDLE hProcess, //目标进程的句柄,进程的句柄须有PROCESS_QUERY_INFORMATION和PROCESS_VM_READ权限
HMODULE hModule, //目标模块的句柄,为NULL时函数返回的是进程可执行文件的路径
LPTSTR lpFilename, //接收路径的字符串缓冲区
DWORD nSize //缓冲区的大小
);
#include <Psapi.h> #pragma comment (lib,"Psapi.lib") ... HANDLE h_Process=OpenProcess(PROCESS_QUERY_INFORMATION |PROCESS_VM_READ,FALSE,ProcessID); CString strPath; if(!GetModuleFileNameEx(h_Process,NULL,strPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH+1)) return false; ...
如果想要获取指定文件所在的目录可以使用MFC中CFile类的成员函数:CFile::GetFilePath();
HMODULE GetModuleHandle(LPCTSTR lpModuleName
); 返回加载到当前进程地址空间的可执行文件或DLL文件的句柄,若参数为NULL,则返回当前进程的句柄(当前应用程序实例句柄)。