Catalog
  1. Visual Studio #1
    1. 1. 数据类型
      1. HINSTANCE
      2. HANDLE
VisualStudio1

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中几乎所有的东西都是用句柄来标识的,文件句柄、窗口句柄、线程句柄和模块句柄等,同样道理,不必关心它们的值究竟是多少,拿来用就是了!

原文链接:模块句柄(实例句柄)和句柄的区别

Author: Peter Duan
Link: https://peter-duan.github.io/hexo/2020/04/13/VisualStudio1/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.

Comment