Visual Studio #1
我用Visual Studio写C++程序也有一段时间了,但是总是记不住很多东西,所以还是把知识写下来会比较好
1. 数据类型
Win32 API中微软给定义了许多数据类型,下面是我认为比较重要的。
其中,大多的指针类型名称前缀使用 P(Pointer)或LP(Long Pointer)
名称 | 类型 | 原型 | 解释 |
---|---|---|---|
PVOID | void * | typedef void *PVOID | A pointer to any type. |
HANDLE | Pointer | typedef PVOID HANDLE | A handle to an object. |
HINSTANCE | HANDLE | typedef HANDLE HINSTANCE | A handle to an instance. This is the base address of the module in memory. |
HWND | HANDLE | typedef HANDLE HWND | A handle to a window. |
DWORD | unsigned long | typedef unsigned long DWORD | A 32-bit unsigned integer. The range is 0 through 4294967295 decimal. |
WORD | unsigned short | typedef unsigned short WORD | A 16-bit unsigned integer. The range is 0 through 65535 decimal. |
BYTE | unsigned char | typedef unsigned char BYTE | A byte (8 bits). |
BOOLEAN | BYTE | typedef BYTE BOOLEAN | A Boolean variable (should be TRUE or FALSE). |
LPSTR | CHAR * | typedef CHAR *LPSTR | A pointer to a null-terminated string of 8-bit Windows (ANSI) characters. For more information, see Character Sets Used By Fonts. |
LPTSTR | CHAR* /WCHAR* | #ifdef UNICODE typedef LPWSTR LPTSTR; #else typedef LPSTR LPTSTR; #endif |
An LPWSTR if UNICODE is defined, an LPSTR otherwise. For more information, see Windows Data Types for Strings. |
LPWSTR | WCHAR * | typedef CONST WCHAR *LPCWSTR | A pointer to a constant null-terminated string of 16-bit Unicode characters. For more information, see Character Sets Used By Fonts. |
LPCSTR | CONST CHAR * | typedef __nullterminated CONST CHAR *LPCSTR | A pointer to a constant null-terminated string of 8-bit Windows (ANSI) characters. For more information, see Character Sets Used By Fonts. |
LPCTSTR | 略 | 略 | 略 |
LPCWSTR | 略 | 略 | 略 |
更多请参考Windows Data Types。有几个,我会单独讲讲。
HINSTANCE
一个模块代表的是一个运行中的exe文件或dll文件,用来代表这个文件中所有的代码和资源,磁盘上的文件不是模块,装入内存后运行时就叫做模块。一个应用程序调用其他DLL中的API时,这些DLL文件被装入内存,就产生了不同的模块,为了区分地址空间中的不同模块,每个模块都有一个惟一的模块句柄来标识。Win16,Win16中不同运行程序的地址空间并非是完全隔离的,一个可执行文件运行后形成”模块”,多次加载同一个可执行文件时,这个”模块”是公用的,为了区分多次加载的”拷贝”,就把每个”拷贝”叫做实例,每个实例均用不同的”实例句柄”(hInstance)值来标识它们。但在Win32中,程序运行时是隔离的,每个实例都使用自己私有的4 GB空间,都认为自己是惟一的,不存在一个模块的多个实例的问题,实际上在Win32中,实例句柄就是模块句柄,但很多API原型中用到模块句柄的时候使用的名称还是沿用hInstance,所以我们还是把变量名称取为hInstance。
HANDLE
随着分析的深入,句柄(handle)一词也出现得频繁起来,”句柄”是什么呢?句柄只是一个数值而已,它的值对程序来说是没有意义的,它只是Windows用来表示各种资源的编号而已,可见只有Windows才知道怎么使用它来引用各种资源。
下面举例说明。屏幕上已经有10个窗口,Windows把它们从1到10编号,应用程序又建立了一个窗口,现在Windows把它编号为11,然后把11当做窗口句柄返回给应用程序,应用程序并不知道11代表的是什么,但在操作窗口的时候,把11当做句柄传给Windows,Windows自然可以根据这个数值查出是哪个窗口。当该窗口关闭的时候,11这个编号作废。第二次运行的时候,如果屏幕上现有5个窗口,那么现在句柄可能就是6了,所以,应用程序并不用关心句柄的具体数值是多少。打个比方,可以把句柄当做是商场中寄放书包时营业员给的纸条,纸条上的标记用户并不知道是什么意思,但把它交还给营业员的时候,她自然会找到正确的书包。
Windows中几乎所有的东西都是用句柄来标识的,文件句柄、窗口句柄、线程句柄和模块句柄等,同样道理,不必关心它们的值究竟是多少,拿来用就是了!
原文链接:模块句柄(实例句柄)和句柄的区别