rt,谢谢
解决方案 »
- 关于右键弹出菜单图标无法显示的问题
- 编译原理的问题
- MFC ActiveX控件 如何随动态改变大小?
- 500分: 谁能解决者立刻给分,本贴不算,up 有分
- 有谁知道FAT32的卷标放在哪个扇区上,如何来读写?
- 想请问大家知道网上有哪些网校?就是那种交了钱,通过一个客户端来学习的那种
- 算法问题
- VC++ ADO修改记录失败 返回错误:IDispatch error #3105 请问为什么
- HOOK GetProcAddress的问题
- 多程序共享同一地方的内存数据,有VC,Visual Fortan两种种编程语言分别编写,怎样共享同一地方的内存
- 请教一个BHO编程方面的问题
- 怎样利用win API得到一个目录下的所有文件?
HINSTANCE 在win32下与HMODULE是相同的东西,在Win32下还存在主要是因为win16
程序使用HINSTANCE来区别task。
象或G D I对象。句柄表的详细结构和管理方法并没有具体的资料说明。通常我并不介绍操作系统中
没有文档资料的那些部分。不过,在这种情况下,我会进行例外处理,因为,作为一个称职的
Wi n d o w s程序员,必须懂得如何管理进程的句柄表。由于这些信息没有文档资料,因此不能保证所
有的详细信息都正确无误,同时,在Windows 2000、Windows 98和Windows CE中,它们的实现方
法是不同的。为此,请认真阅读下面介绍的内容以加深理解,在此不学习系统是如何进行操作的。
表3 - 1显示了进程的句柄表的样子。可以看到,它只是个数据结构的数组。每个结构都包
含一个指向内核对象的指针、一个访问屏蔽和一些标志。
表3-1 进程的句柄结构
索引 内核对象内存块的指针 访问屏蔽 标志
(标志位的D W O R D) (标志位的D W O R D)
1 0 x ? ? ? ? ? ? ? ? 0 x ? ? ? ? ? ? ? ? 0 x ? ? ? ? ? ? ? ?
2 0 x ? ? ? ? ? ? ? ? 0 x ? ? ? ? ? ? ? ? 0 x ? ? ? ? ? ? ? ?
... ... ... ...用于创建内核对象的所有函数均返回与进程相关的句柄,这些句柄可以被在相同进程中运
行的任何或所有线程成功地加以使用。该句柄值实际上是放入进程的句柄表中的索引,它用于
标识内核对象的信息存放的位置。因此当调试一个应用程序并且观察内核对象句柄的实际值时,
会看到一些较小的值,如1,2等。请记住,句柄的含义并没有记入文档资料,并且可能随时变
更。实际上在Windows 2000中,返回的值用于标识放入进程的句柄表的该对象的字节数,而不
是索引号本身。
HINSTANCE是exe模块的句柄, 通常等于0x00400000,也就是exe模块在
进程地址空间中的首地址.
DECLARE_HANDLE(HINSTANCE);#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
typedef HINSTANCE HMODULE; /* HMODULEs can be used in place of HINSTANCEs */
{
const IMAGE_DOS_HEADER * pHeader = (const IMAGE_DOS_HEADER *) hModule; char message[128]; wsprintf(message, "%x", pHeader->e_magic); MessageBox(NULL, message, "IMAGE_DOS_HEADER", MB_OK);
}int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
{
Dump(hInstance);
...
}