HRESULT 来向用户报告各种情况。   他的值位于  WINERROR.H中

QueryInterface返回一个HRESULT值。

HRESULT不是一个句柄,他是一个可分成三个域的32位值。   Here's the RESULT

其低16位包含函数返回的代码,  其余15位包含的是此类型及返回值起源的详细信息。

其结构为:

我们的应用程序在开发过程中,在WINERROR.H中查找HRESULT值的含义是可以的,但在某些情况下,应用需要一种获取与某个特定HRESULT值相应的徐哦呜消息并将其显示出来的方法。以显示标准COM错误消息,可以使用 FormatMessage  Win32 API函数:

//它的功能就是将GetLastError函数得到的错误信息(这个错误信息是数字代号)转化成字符串信息的函数。

DWORD WINAPI FormatMessage(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPTSTR lpBuffer, DWORD nSize, va_list *Arguments);

//dwFlags
标志位,决定如何说明lpSource参数,dwFlags的低位制定如何处理换行功能在输出缓冲区,也决定最大宽度的格式化输出行。
//lpSource
根据dwFlags标志而定。[1]
dwMessageId
请求的消息的标识符。当dwFlags标志为FORMAT_MESSAGE_FROM_STRING时会被忽略。[1]
dwLanguageId
请求的消息的语言标识符。
LPTSTR lpBuffer
接收错误信息描述的缓冲区指针。
nSize
如果FORMAT_MESSAGE_ALLOCATE_BUFFER标志没有被指定,这个参数必须指定为输出缓冲区的大小,如果指定,这个参数指定为分配给输出缓冲区的最小数。[1]
Arguments
保存格式化信息中的插入值的一个数组。
void ErrorMessage(LPCTSTR str, HRESULT hr)
{
void *pMsgBuf;
::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FORM_SYSTEM, NULL, hr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&pMsgBuf, 0, NULL); cout << str << endl;
cout << "error:" << (LPTSTR)pMsgBuf << endl;
LocalFree(pMsgBuf);
}

在使用HRESULT时,  函数在各种情况下返回的状态代码通常将包含多个成功代码及多个失败代码。 所以我们要使用SUCCEED 及 FAILED宏。  一般不能直接将HRESULT值同某个成功代码(S_OK)进行比较以决定某个函数是否成功,也不能直接将其同某个失败代码进行比较以决定函数是否失败。

HRESULT hr = CoCreateInstance();
if(hr == E_FAILED)
...
// if(FAILED(hr) hr = PI->QueryInterface();
if(hr == S_OK)
...
//if(SUCCEED(hr)) PI->Release();

GUID(Globally Unique Identifier   全局唯一标识符)

使接口的标识符是唯一的。

2013.8.9

jofranks 于南昌        未完待续

【COM学习】之二、HRESULT,GUID的更多相关文章

  1. crawler4j 学习(二)

    crawler4j 学习(二) 实现控制器类以制定抓取的种子(seed).中间数据存储的文件夹.并发线程的数目: public class Controller { public static voi ...

  2. 从零开始学习jQuery (二) 万能的选择器

    本系列文章导航 从零开始学习jQuery (二) 万能的选择器 一.摘要 本章讲解jQuery最重要的选择器部分的知识. 有了jQuery的选择器我们几乎可以获取页面上任意的一个或一组对象, 可以明显 ...

  3. Android Animation学习(二) ApiDemos解析:基本Animators使用

    Android Animation学习(二) ApiDemos解析:基本Animatiors使用 Animator类提供了创建动画的基本结构,但是一般使用的是它的子类: ValueAnimator.O ...

  4. AspectJ基础学习之二搭建环境(转载)

    AspectJ基础学习之二搭建环境(转载) 一.下载Aspectj以及AJDT 上一章已经列出了他的官方网站,自己上去download吧.AJDT是一个eclipse插件,开发aspectj必装,他可 ...

  5. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  6. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  7. MyBatis学习系列二——增删改查

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...

  8. MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存

    目录(?)[-] 二SQL语句映射文件2增删改查参数缓存 select insert updatedelete sql parameters 基本类型参数 Java实体类型参数 Map参数 多参数的实 ...

  9. MyBatis学习 之 二、SQL语句映射文件(1)resultMap

    目录(?)[-] 二SQL语句映射文件1resultMap resultMap idresult constructor association联合 使用select实现联合 使用resultMap实 ...

  10. UML学习(二)-----类图

    UML学习(二)-----类图 http://www.cnblogs.com/silent2012/archive/2011/09/07/2169946.html http://www.cnblogs ...

随机推荐

  1. App_Code

    App_Code,文件夹是·NET平台下.在创建网站时,系统为类自动放的位置.它位于Web应用程序根目录下,其存储所有应当作为应用程序的一部分动态编译的类文件.这些类文件自 动链接到应用程序,而不需要 ...

  2. SQL Server 性能篇- 碎片

    本文分为两个问题: 第一,碎片是什么:第二,碎片怎么处理: 现在,来找解决这两个问题:  一.碎片是什么 说到碎片,就要提到索引了,索引用着挺爽的啊!是的,一旦索引建立,我们搜索数据的效率就提高了:然 ...

  3. GDAL库学习笔记(1):无缝拼接Google卫星图

    开工之前要先了解一下瓦片地图,瓦片地图金字塔模型是一种多分辨率层次模型,从瓦片金字塔的底层到顶层,分辨率越来越低,但表示的地理范围不变.实现原理就是,首先确定地图服务平台所要提供的缩放级别的数量N,把 ...

  4. Zigbee2007协议中文介绍

    Zigbee2007中文介绍ZigBee2007规范定义了ZigBee和ZigBee Pro两个特性集,全新的ZigBee 2007规范建立在ZigBee2006之上,不但提供了增强型的功能而且在某些 ...

  5. 获取ActiveX控件本身所在的路径 和 error PRJ0050

    一. CString   GetCurPath()     {     TCHAR       exeFullPath[MAX_PATH];     CString       strPath;    ...

  6. Counting square

    Problem Description There is a matrix of size R rows by C columns. Each element in the matrix is eit ...

  7. Redmine开启服务

    写了一个启动Redmine的开机脚本,redmine文件在/etc/init.d/下 #!/bin/sh ### BEGIN INIT INFO # Provides: Dean Chen # Req ...

  8. STL集合容器set按照由小到大或者由大到小的顺序存放元素

    (1)由小到大 set<int,less<int>> M; M.insert(1960); M.insert(1952); M.insert(1771); M.insert(1 ...

  9. 11gR2 RAC启用iptables导致节点宕机问题处理

    通常,在安装数据库时,绝大多数都是要求把selinux及iptables关闭,然后再进行安装的.但是在运营商的系统中,很多安全的因素,需要将现网的数据库主机上的iptables开启的. 在开启ipta ...

  10. paip.vs2010 或.net 4.0安装出错解决大法.

    paip.vs2010 或.net 4.0安装出错解决大法. 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.cs ...