进程句柄不同于进程内核对象的句柄
进程内核对象句柄:代表整个进程的
进程句柄:exe或者dll装入某个进程的地址空间,有唯一的实例句柄,也可以叫做模块句柄
进程句柄的本质是进程模块在进程地址空间中的首地址!
一:GetModuleFileName
DWORD WINAPI GetModuleFileName( _In_opt_ HMODULE hModule, //进程句柄 _Out_ LPTSTR lpFilename, //文件名 _In_ DWORD nSize //pszPath指向的内存的大小 );如何获得一个进程或者执行文件的模块名呢
通过GetModuleHandleName函数
二:获得进程句柄
获得进程句柄的方式
1、GetModuleHandle函数
2、WinMain函数的第一个参数hInstance
3、使用extern "C" HANDLE __ImageBase;
GetModuleHandle函数:
1、只检查本进程的地址空间,不检查别的地址空间
2、当参数为NULL时候,这个句柄就是当前程序的起始地址
#include<windows.h> #include<tchar.h> extern "C" HANDLE __ImageBase;//这是一个伪变量,可以看成当前模块的起始地址 int main() { HMODULE hModule = GetModuleHandle(L"Kernel32.dll");//获得这个模块的句柄 _tprintf(L"%0x\n", hModule); //CloseHandle(hModule);模块句柄不要释放 //如何获得当前进程句柄 HMODULE hCurrent_Module = GetModuleHandle(NULL);//这个句柄就是当前程序的起始地址 _tprintf(L"%0x\n", hCurrent_Module); /*在DLL中用这个好些*/ _tprintf(L"%0x\n",& __ImageBase);//直接打印全局变量,就可以获得当前模块句柄 TCHAR filename[MAX_PATH]; GetModuleFileName(hCurrent_Module, filename, MAX_PATH); //获取文件名路径 _tprintf(L"%s\n", filename); _gettchar(); return 0; }