摘自:Win32汇编----罗云彬
第4章 第一个窗口程序
4.2 分析窗口程序(1)
4.2.1 模块和句柄
1. 模块的概念
一个模块代表的是一个运行中的exe文件或dll文件,用来代表这个文件中所有的代码和资源,磁盘上的文件不是模块,装入内存后运行时就叫做模块。一个应用程序调用其他DLL中的API时,这些DLL文件被装入内存,就产生了不同的模块,为了区分地址空间中的不同模块,每个模块都有一个惟一的模块句柄来标识。
很多API函数中都要用到程序的模块句柄,以便利用程序中的各种资源,所以在程序的一开始就先取得模块句柄并存放到一个全局变量中可以省去很多的麻烦,在Win32中,模块句柄在数值上等于程序在内存中装入的起始地址。
取模块句柄使用的API函数是GetModuleHandle,它的使用方法是:
invoke GetModuleHandle,lpModuleName
lpModuleName参数是一个指向含有模块名称字符串的指针,可以用这个函数取得程序地址空间中各个模块的句柄,例如,如果想得到User32.dll的句柄以便使用其中包含的图标资源,那么可以如下使用:
szUserDll db 'User32.dll',0
…
invoke GetModuleHandle,addr szUserDll
.if eax
mov hUserDllHandle,eax
.endif
…
如果使用参数NULL调用GetModuleHandle,那么得到的是调用者本模块的句柄,我们的源程序中就是这样使用的:
invoke GetModuleHandle,NULL
mov hInstance,eax
可以注意到,把返回的句柄放到了hInstance变量里而并不是放在hModule中,为什么是 hInstance呢? Instance是“实例”,它的概念来自于Win16,Win16中不同运行程序的地址空间并非是完全隔离的,一个可执行文件运行后形成“模块”,多次加载同一个可执行文件时,这个“模块”是公用的,为了区分多次加载的“拷贝”,就把每个“拷贝”叫做实例,每个实例均用不同的“实例句柄”(hInstance)值来标识它们。
但在Win32中,程序运行时是隔离的,每个实例都使用自己私有的4 GB空间,都认为自己是惟一的,不存在一个模块的多个实例的问题,实际上在Win32中,实例句柄就是模块句柄,但很多API原型中用到模块句柄的时候使用的名称还是沿用hInstance,所以我们还是把变量名称取为hInstance。
在C语言的编程中,hInstance通过WinMain由系统传入,WinMain的原型是:
WinMain(hInstance,hPrevInstance,lpzCmdParam,nCmdShow),程序不用自己去获得hInstance,但在Win32汇编中必须自己获取,如果不了解hModule就是hInstance的话,就无法得知如何得到hInstance,因为并没有一个类似于GetInstanceHandle之类的API函数。
分享到:
相关推荐
int WINAPI WinMain(HINSTANCE hInstance, // 当前实例 HINSTANCE hPrevInstance, // 前一个实例 PSTR szCmdLine, // 命令行参数 int iCmdShow) // 应用程序初始显示方式 { static char AppName[] = "ToyBrick";...
1. `hInstance`:应用程序的当前实例句柄,用于访问本进程中的资源。 2. `hPrevInstance`:在早期的16位Windows系统中用于处理多实例,但在32位Windows系统中通常为NULL。 3. `szCmdLine`:指向传递给程序的命令行...
在“ATL只允许一个实例运行”的场景中,我们通常指的是实现单例模式(Singleton Pattern)来确保应用程序只有一个实例在运行。单例模式是一种设计模式,它保证了类只有一个实例,并提供一个全局访问点。 在ATL中...
SendMessage(HWND_BROADCAST, WM_COPYDATA, (WPARAM)hInstance, (LPARAM)&cds); ``` 5. **接收并处理消息**:在已运行的程序中,我们需要监听`WM_COPYDATA`消息,根据接收到的数据做出相应的处理。 ```cpp ...
1. `HINSTANCE hInstance`:当前实例的句柄,用于标识正在运行的程序。 2. `HINSTANCE hPrevInstance`:前一个实例的句柄,在现代Windows版本中始终为`NULL`。 3. `LPSTR lpCmdLine`:指向命令行参数的指针,用于...
2. **创建Hook**:使用SetWindowsHookEx函数,指定Hook类型、Hook回调函数、目标进程的HINSTANCE以及钩子的作用范围。 3. **安装Hook**:将创建的Hook安装到目标进程中。对于系统级Hook,需要确保Hook所在的线程...
* 全局量的声明:包括HINSTANCE hInst和LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM)等。 * WinMain函数:是程序的入口点,负责初始化窗口和注册窗口类。 * 窗口过程函数WndProc:负责处理窗口的消息,...
hInstance, // 应用程序实例句柄 NULL // 创建参数 ); ``` 窗口过程函数`WndProc`是窗口消息的处理中心,它接收来自系统的消息并进行相应处理。例如,当用户关闭窗口时,会发送`WM_DESTROY`消息,我们可以在此处...
HINSTANCE hLib = LoadLibrary("MyCom.dll"); if (hLib != NULL) { DllGetClassObjectProc pDllGetClassObject = (DllGetClassObjectProc)GetProcAddress(hLib, "DllGetClassObject"); if (pDllGetClassObject) {...
- HINSTANCE:表示模块实例,通常用于装载动态链接库(DLL)或程序本身。 - HWND:窗口句柄,标识应用程序中的特定窗口。 - HANDLE:通用句柄,可以表示任何系统对象,如线程、进程、事件等。 - WPARAM和LPARAM...
`WinMain`函数是Windows程序的主入口点,它接收四个参数:程序实例句柄、前一实例句柄(在单实例程序中通常为NULL)、命令行参数以及显示模式。在这里,我们注册了一个新的窗口类,并创建了一个窗口。`CreateWindow`...
- 定义一个全局变量,用于保存应用程序实例句柄,如`HINSTANCE g_hInstance = NULL;` - 在`int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)`函数中,检查...
本篇文章将详细讲解如何使用API在Windows平台上建立一个基本的窗口实例。 首先,我们需要了解创建窗口的基本步骤: 1. **初始化WinMain函数**:这是所有Windows程序的入口点。在这个函数里,我们将调用`WinMain`...
C++编程实例详解C++ #include //窗口对象的过程处理函数 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //Windows应用程序的主函数 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR lpszCmdLine...
总的来说,通过实践“动态链接库(Dll)实例 VC++ MFC编程案例”,你可以深入了解Dll的原理和应用,学习如何在MFC环境中创建和使用Dll,这对于提高软件开发的专业技能和解决问题的能力大有裨益。同时,这也是一个很...
### Windows API开发详解:函数、接口与编程实例 在计算机科学领域中,API(Application Programming Interface,应用程序编程接口)是一种让软件组件之间进行交互的方法。Windows API是Microsoft为Windows操作系统...
本教程将详细探讨C++中如何实现一个完美的钩子使用实例。 首先,我们需要理解钩子的基本概念。在Windows API中,钩子是一种机制,它允许程序在特定事件发生时执行代码,如键盘输入、鼠标点击或系统消息的传递。通过...
这个实例就是一个典型的示例,教给初学者如何在VC++环境中实现这样的功能。在这个实例中,我们将探讨如何利用Windows消息处理机制、GDI(Graphics Device Interface)图形库以及鼠标事件来判断鼠标是否在矩形框内。 ...
// 当前应用程序实例 TCHAR szTitle[MAX_LOADSTRING] = "Hello,World!"; // 窗口的标题栏 TCHAR szWindowClass[MAX_LOADSTRING] = "Hello"; // 窗口类字符串 int APIENTRY WinMain(HINSTANCE hInstance, ...