获取当前句柄的4种方法

24 篇文章 1 订阅
我们经常会获取当前进程的进程句柄,那么获取进程句柄的方法都有哪些呢?下面是总结的三种方法。
注意: 句柄其实就是应用程序的其实地址

方法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函数的第一个参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值