代码改变世界

MFC C++类型学习

2008-02-16 11:22  cppguy  阅读(525)  评论(0编辑  收藏  举报


   HRESULT 类型
-------------------------------------------------------------------------------
大多数 COM 函数以及一些接口成员函数的返回值类型均为 HRESULT 类型。HRESULT 类型的返回值反映了函数中的一些情况,其类型定义规范如下:

   31 30 29 28                    16 15                                0
  |-----|--|------------------------|-----------------------------------|

类别码 (30-31) 反映函数调用结果:
                00 调用成功
                01 包含一些信息
                10 警告
                11 错误
自定义标记(29) 反映结果是否为自定义标识,1 为是,0 则不是;
操作码 (16-28) 标识结果操作来源,在 Windows 平台上,其定义如下:
                #define FACILITY_WINDOWS         8
                #define FACILITY_STORAGE         3
                #define FACILITY_RPC             1
                #define FACILITY_SSPI            9
                #define FACILITY_WIN32           7
                #define FACILITY_CONTROL         10
                #define FACILITY_NULL            0
                #define FACILITY_INTERNET        12
                #define FACILITY_ITF             4
                #define FACILITY_DISPATCH        2
                #define FACILITY_CERT            11
操作结果码(0-15) 反映操作的状态,WinError.h 定义了 Win32 函数所有可能返回结果。
                以下是一些经常用到的返回值和宏定义:
                S_OK            函数执行成功,其值为 0 (注意,其值与 TRUE 相反)
                S_FALSE         函数执行成功,其值为 1
                S_FAIL          函数执行失败,失败原因不确定
                E_OUTOFMEMORY   函数执行失败,失败原因为内存分配不成功
                E_NOTIMPL       函数执行失败,成员函数没有被实现
                E_NOTINTERFACE  函数执行失败,组件没有实现指定的接口

不能简单地把返回值与 S_OK 和 S_FALSE 比较,而要用 SECCEEDED 和 FAILED 宏进行判断。


   DWORD 类型
-------------------------------------------------------------------------------
就是UNSIGN LONG
在win32下是4个字节

它的长度是定义的
也就是在win32中有这样的定义:
#define DWORD unsigned long

所以比较方便移植用的

Windows下经常用来保存地址(或者存放指针)
其他unsigned long可以用的地方,它也是可以用的

HANDLE 类型
-------------------------------------------------------------------------------
句柄是资源或项目的唯一标识,Windows程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的,相反的,Windows API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄进行操作。
     windows用来表示被应用程序所建立或使用的对象的唯一整数,Windows私用各种各样的句柄表示诸如应用程序实例,窗口,控制位图,GDI对象等等。Windows句柄有点像C语言中的文件句柄
     从上面2个定义中的我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的,它就像我们的姓名一样,每个人都会有一个,不同的人的姓名不一样,但是,也可能有一个名字和你一样的人。从数据类型上来看它只是一个16位的无符号整数。应用程序几乎总是通过调用一个Windows函数来获得一个句柄,之后其他的WIndows就可以使用该句柄,以引用相应的对象。在WINDOWS编程中会用到大量的句柄,比如:HINSTANCE(实例句柄),HBITMAP(位图句柄),HDC(设备描述句柄),HICON(图标句柄)等等,这当中还有个通用的句柄,就是HANDLE,比如下面的语句:
HINSTANCE hInstance;
可以改成:
HANDLE hInstance;
上面的2句都是对的。
一个Windows应用程序可以用不同的方法获得一个特定项的句柄,许多API函数,诸如
CreateWindow,GlobalAlloc,OpenFile的返回值都是一个句柄值。另外,Windows也能通过应用程序的引用函数将一个句柄作为参数传送给应用程序,应用程序一旦获得了一个确定项的句柄,便可在WIndows环境下的任何地方对这个句柄进行操作,其实句柄的大量使用已经影响到了每一个Windows的程序设计。
     句柄只有当唯一的确定了一个项目的哦时候,它才开始有意义。句柄对应着项目表中的一项,而只有WIndows本身才能直接存取这个表,应用程序只能通过API函数来处理不同的句柄,举个例子来说吧!比如我们可以为我们应用程序申请一块内存块,通过调用API函数GlobalAlloc,来返回一个句柄值:
hMEm=GlobalAlloc();
     其实现在HMEm的值指示一个索引值,不是物理地址,应用程序还不能直接存取这块内存。这儿还有一个话外题,就是,一般情况下我们在编程的时候,给应用程序分配的内存都是可以移动的或者是可以丢弃的,这样能使有限的内存资源充分利用,所以,在某一个时候我们分配的那块内存的地址是不确定的,因为它是可以移动的,所以得先锁定那块内存块,这儿应用程序需要调用API函数GlobalLock函数来锁定句柄,如下:
lpMem=GlobalLock(hMem);
这样应用程序才能存取这块内存。

LPCTSTR

--------------------------------------------------------------------------

L这是一个Long指针,这是为了兼容WIndows 3.1等16位操作系统遗留下来的,在win32中以及其他的32位操作系统中,long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义
P表示这是一个指针
C表示是一个常量
T在Win32环境中, 有一个_T宏, 这个宏用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏, 那么这个字符或者字符串将被作为UNICODE字符串, 否则就是标准的ANSI字符串。
STR表示这个变量是一个字符串。
所以LPCTSTR就表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。