进程的实例句柄

          WinMain函数中的句柄值实际上是个基本内存地址,它指出系统在何处把EXE文件装载入进程的地址空间。例如,如果系统打开了可执行文件,在地址0X400000处装载了它的内容,那么进程实例句柄的值就是0X400000。这个基本地址是连接器决定的,当然,我们也可以自己设定,不同版本的连接器使用不同的缺省值,对于VC,可以使用/BASE:address开关来改变该值

    每个加载进进程地址空间的EXE或DLL文件都被赋予了一个唯一的实例句柄,在调用装入资源的时候需要该句柄值。WIN32 API并不区分一个进程的HMODULE,HINSTANCE值---它们是同一个。

      我们可以通过下面这个函数来获取调用进程中某个模块的基地址。

HMODULE GetModuleHandle( LPCTSTR lpModuleName);

Parameters
lpModuleName
[in] Pointer to a null-terminated string that contains the name of the module, which must be a DLL file.

If the file name extension is omitted, the default library extension .dll is appended.

The file name string can include a trailing point character (.) to indicate that the module name has no extension.

If this parameter is NULL, GetModuleHandle returns a handle to the file used to create the calling process. All paths are ignored; only the file name and extension are used.

The file extensions .dll and .cpl are treated as identical when comparing module names.

Return Values

A handle to the specified module indicates success.

NULL indicates failure.

To get extended error information, call GetLastError.

 

    该函数有2个需要注意的地方,首先,它只是查看进程的地址空间,如果要查询的模块不在进程的地址空间(模块根本未加载或者加载在其它进程的地址空间),返回的都是NULL,其次,如果参数传递为NULL时,返回的是EXE的基本地址,因此在进程的任何一个模块中调用该函数,返回的都是EXE的基地址。

### 实例句柄(Instance Handle) #### 定义 实例句柄通常指的是程序在运行时,操作系统为某个特定资源(例如窗口进程、线程、文件等)分配的一个唯一标识符。这个标识符可以是一个指针、整数或者其他形式的数据类型,用来表示一个内核对象或者用户对象的引用。根据具体的应用场景,实例句柄可能是指向内存地址的指针,也可能是系统内部维护的索引值。 例如,在Windows API编程中,`HANDLE` 类型用于表示各种系统资源的句柄,它本质上是一个 `void*` 指针类型[^1]。对于窗口程序设计来说,窗口句柄(`HWND`)是实例句柄的一种表现形式,它代表了某个具体的窗口对象,并且通过该句柄可以在程序中对窗口进行操作。 #### 作用 1. **间接访问资源** 实例句柄提供了一种间接访问系统资源的方式。应用程序并不直接操作底层对象,而是通过句柄来与这些对象交互。例如,文件句柄允许程序读写文件,而无需关心文件在磁盘上的际存储位置[^3]。 2. **抽象化封装** 句柄机制隐藏了对象的现细节,使得开发者只需关注如何使用句柄进行操作,而不必了解对象在系统中的具体结构或存储方式。这种抽象化提升了代码的安全性可维护性。 3. **资源管理与生命周期控制** 系统通过句柄来跟踪管理资源的使用情况。当程序不再需要某个资源时,可以通过关闭句柄来释放相关资源。这种方式有助于防止资源泄漏并确保系统的稳定性。 4. **跨模块通信与共享** 在某些情况下,句柄可以在不同的模块或进程中传递,从而现资源共享。例如,一个进程可以将文件句柄传递给另一个进程,使其也能访问同一个文件。 5. **运行时唯一性** 在程序的一次运行过程中,句柄通常是唯一的,并且不会改变。然而,如果程序重新启动,则同一对象的句柄值可能不同。这类似于“打牌”的比喻:每次游戏开始,手中的牌都是新的,即使内容相同,它们仍然是不同的实例[^2]。 #### 示例代码(Windows API中获取当前实例句柄) ```c #include <windows.h> HINSTANCE hInst; // 实例句柄 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { hInst = hInstance; // 将当前实例句柄保存下来 // 其他初始化代码... return 0; } ``` 在这个例子中,`hInstance` 是一个 `HINSTANCE` 类型的变量,它就是实例句柄,代表了当前应用程序的实例。通过这个句柄,可以加载资源、创建窗口等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值