我们经常会获取当前进程的进程句柄,那么获取进程句柄的方法都有哪些呢?下面是总结的三种方法。
注意: 句柄其实就是应用程序的其实地址。
方法1.
使用win32 API函数实现该功能。如下代码所示:
#include <Windows.h>
#include <wchar.h>
int main()
{
HMODULEhCurrent_Module =GetModuleHandle(NULL);//这个句柄参数为NULL就是当前程序的起始地址
_tprintf(L"%0x\n", hCurrent_Module);
me);
_gettchar();
return0;
}
输出结果为:
250000
这样就会获取当前进程的句柄,API函数GetModuleHandle如果参数为NULL就是当前程序的起始地址,如果传入其他文件,比如kernel32.dll那么他的地址就会变成该动态库的起始地址。
方法2:
声明全局变量的句柄类型。如下代码所示:
#include <Windows.h>
#include <wchar.h>
extern "C" HANDLE __ImageBase;
int main()
{
_tprintf(L"%0x\n", &__ImageBase);
_gettchar();
return0;
}
输出结果:
250000
这个结果与方法1的结果一样说明此方法的可行性,是完全可以使用的。
方法3:
方法三针对的是一个函数如何获取他的句柄,比如以下:
void fun(HMODULE *hModule)
{
GetModuleHandleEx(
GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
//标志
(PCTSTR)fun,
//该函数名
&hModule);
//该函数参数
}
方法4
如果我们创建窗口句柄的话就可以直接使用该WinMain函数的第一个参数。
还是之前的程序我们通过属性-》配置属性-》连接器-》系统-》子系统设置为“未设置”即可。通过设置断点,和VS自带的变量查看工具查看信息。因为如果这样设置后就不会出现控制台,也不会出现win32界面。
#include <Windows.h>
#include <wchar.h>
extern "C" HANDLE __ImageBase;
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPreInstanc,TCHAR*, int)
{
HMODULEhModule = GetModuleHandle(L"Kernel32.dll");
_tprintf(L"%0x\n", hModule);
HMODULEhCurrent_Module = GetModuleHandle(NULL);//这个句柄就是当前程序的起始地址
_tprintf(L"%0x\n", hCurrent_Module);
TCHARfilename[MAX_PATH];
GetModuleFileName(hCurrent_Module, filename, MAX_PATH);
_tprintf(L"%s\n", filename);
GetModuleFileName(hModule, filename, MAX_PATH);
_tprintf(L"%s\n", filename);
_tprintf(L"%0x\n", &__ImageBase);
_gettchar();
return0;
}
这个程序他的句柄就是WinMain函数的第一个参数。
注意: 句柄其实就是应用程序的其实地址。
方法1.
使用win32 API函数实现该功能。如下代码所示:
#include <Windows.h>
#include <wchar.h>
int main()
{
me);
}
输出结果为:
250000
这样就会获取当前进程的句柄,API函数GetModuleHandle如果参数为NULL就是当前程序的起始地址,如果传入其他文件,比如kernel32.dll那么他的地址就会变成该动态库的起始地址。
方法2:
声明全局变量的句柄类型。如下代码所示:
#include <Windows.h>
#include <wchar.h>
extern "C" HANDLE __ImageBase;
int main()
{
}
输出结果:
250000
这个结果与方法1的结果一样说明此方法的可行性,是完全可以使用的。
方法3:
方法三针对的是一个函数如何获取他的句柄,比如以下:
void fun(HMODULE *hModule)
{
}
方法4
如果我们创建窗口句柄的话就可以直接使用该WinMain函数的第一个参数。
还是之前的程序我们通过属性-》配置属性-》连接器-》系统-》子系统设置为“未设置”即可。通过设置断点,和VS自带的变量查看工具查看信息。因为如果这样设置后就不会出现控制台,也不会出现win32界面。
#include <Windows.h>
#include <wchar.h>
extern "C" HANDLE __ImageBase;
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPreInstanc,TCHAR*, int)
{
}