【COM学习】之二、HRESULT,GUID
2013-08-09 23:19
218 查看
HRESULT 来向用户报告各种情况。 他的值位于 WINERROR.H中
QueryInterface返回一个HRESULT值。
HRESULT不是一个句柄,他是一个可分成三个域的32位值。 Here's the RESULT
其低16位包含函数返回的代码, 其余15位包含的是此类型及返回值起源的详细信息。
其结构为:
我们的应用程序在开发过程中,在WINERROR.H中查找HRESULT值的含义是可以的,但在某些情况下,应用需要一种获取与某个特定HRESULT值相应的徐哦呜消息并将其显示出来的方法。以显示标准COM错误消息,可以使用 FormatMessage Win32 API函数:
在使用HRESULT时, 函数在各种情况下返回的状态代码通常将包含多个成功代码及多个失败代码。 所以我们要使用SUCCEED 及 FAILED宏。 一般不能直接将HRESULT值同某个成功代码(S_OK)进行比较以决定某个函数是否成功,也不能直接将其同某个失败代码进行比较以决定函数是否失败。
GUID(Globally Unique Identifier 全局唯一标识符)
使接口的标识符是唯一的。
2013.8.9
jofranks 于南昌 未完待续
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
- COM 技术内幕学习之六 (HRESULT,GUID)
- 这是我学习COM遇到的几个基本问题其解决 黄森堂(vcmfc)著 1.我用ATL生成一个组件对象,我在COM中使用IDD_IEncrypt,这个在哪里写义,是啥?GUID? 答:IDD_IEncry
- COM技术内幕--关于HRESULT、GUID、注册表及其他细节
- COM技术内幕第六章笔记-HRESULT、GUID、注册表及其他
- COM 技术内幕学习之二 (接口)
- 最近在ArcGIS Engine开发中关于调用gp工具过程出现COM 组件的调用返回了错误 HRESULT E_FAIL 错误的解决方法 和 学习oracle中遇到的一些问题总结
- 电路城(www.cirmall.com)-学习IoT,BLE编程绝佳平台,nRF52832 BLE(蓝牙低能耗)开发板
- AE调用 AddField 对 COM 组件的调用返回了错误 HRESULT E_FAIL。-2147467259
- MPF学习之二——Resource
- waeasy.com 我翻译的学习微软云的网站
- 【学习笔记】斯坦福大学公开课(机器学习) 之二:正规方程
- 管理界面的建立(自学习之二)
- CSS学习之二 选择器
- Storyboard学习要点(iOS5新特性学习之二)
- maven学习之二初学maven
- 学习 JavaScript 最难点之二 -- 理解closure(闭包)
- 协议学习小结之二 —— 利用多种协议实现路由跟踪 TraceRoute
- cocos2d-x学习 之二
- 设计模式C++学习笔记之二(Bridge桥梁模式)