获取当前句柄的4种方法

来源:互联网 发布:澳门网络博客有限公司 编辑:程序博客网 时间:2024/05/18 16:54
我们经常会获取当前进程的进程句柄,那么获取进程句柄的方法都有哪些呢?下面是总结的三种方法。
注意:句柄其实就是应用程序的其实地址

方法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函数的第一个参数。
原创粉丝点击