社区
ATL
帖子详情
HRESULT的返回值判断.
sky_horse
2003-02-09 03:46:12
对于HRESULT的返回值一般不能直接用比较的方式判断,而采用宏定义SUCCEEDED和FAILED。但是对于返回值为S_FALSE,该值为0x00000001,用该宏定义判断为真,该值的原意也是函数调用成功,返回值为FALSE。这样,在判断调用某个接口的函数返回值时,如果用宏定义来判断,那么返回S_FALSE时会出错。因为S_FALSE一般是有错的时候返回,而SUCCEEDED宏会认为S_FALSE为真,有什么办法可以简单而正确的判断HRESULT的值的正确性?
...全文
222
4
打赏
收藏
HRESULT的返回值判断.
对于HRESULT的返回值一般不能直接用比较的方式判断,而采用宏定义SUCCEEDED和FAILED。但是对于返回值为S_FALSE,该值为0x00000001,用该宏定义判断为真,该值的原意也是函数调用成功,返回值为FALSE。这样,在判断调用某个接口的函数返回值时,如果用宏定义来判断,那么返回S_FALSE时会出错。因为S_FALSE一般是有错的时候返回,而SUCCEEDED宏会认为S_FALSE为真,有什么办法可以简单而正确的判断HRESULT的值的正确性?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
ydtj829
2003-02-10
打赏
举报
回复
看来只有先判断是否SUCCEED之后再判断是否是S_FALSE了。
Richuen22
2003-02-09
打赏
举报
回复
只能具体问题具体返回。
sky_horse
2003-02-09
打赏
举报
回复
对,因为HRESULT的值表示成功的有多个,表示失败的也有多个。假如直接用hr==S_FALSE,那么其他如果hr==E_FAIL,此时实际是返回失败,只用hr==S_FALSE判断,显然会出错。HRESULT值是用32bit来表示的,最高位bit为成功或失败的标志位。比如0x80000405就是失败的,0x00000000就是成功
该宏定义如下,在winerror.h中
#define SUCCEEDED(Status) ((HRESULT)(Status) >= 0)
#define FAILED(Status) ((HRESULT)(Status)<0)
问题麻烦是S_FALSE是0x00000001,是表示函数调用成功,但返回值为FALSE
所以用以上宏判断时,S_FALSE是返回TRUE的,但实际上如果返回值为S_FALSE,那肯定是有错的。
例如:
。。。
hr=m_pDevEnum->CreateClassEnumerator(refClsid,&pClassEnum,0);
if(FAILED(hr))
{
return hr;
}
当hr=S_FALSE时,FAILED(hr)必定为FALSE, 因为S_FALSE=0x00000001,宏替换后为
if(0x00000001<0)
{
return hr;
}
显然是不会进入 return hr的。
但此时pClassEnum实际为NULL。
我想知道的是有什么简便的方法判断。不想在所有判断后加上判断是否为S_FALSE,或者判断指针为空。
不知道为什么com设计的时候要定义S_FALSE为成功?
ydtj829
2003-02-09
打赏
举报
回复
你的意思就是说SUCCEEDED只能判断有没有返回,而不能判断返回有效无效。是不是不能使用这样的语句;
HRESULT hr=....;
if(hr==S_FALSE)...
不明白。另外可以不可以使用异常捕捉来避免你所说的情况?共同借鉴。
深入
HRESULT
与Windows Error Codes的区别详解
在用C++来开发Windows程序时,经常看到下面的
判断
情况: 代码如下:
HRESULT
hr = ::RegCreateKeyEx(hk, szKeyPath, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_QUERY_VALUE, NULL, &hk, NULL);if (SUCCEEDED(hr)) {在...
VC++ COM组件开发相关实例
一 组件基础 1 软件开发的阶段 1.1 结构化编程 采用自顶向下的编程方式,划分模块 和功能的一种编程方式。 1.2 面向对象编程 采用对象的方式,将程序抽象成类, 模拟现实世界,采用... FAILED宏来
判断
返回
值
.
VC/MFC
HRESULT
类型
HRESULT
类型
返回
值
正确
判断
方法
// 正确的方法是使用宏来作
判断
SUCCEEDED(hr) \ FAILED(hr), 或者
判断
是否==0 if (FAILED(hr)) { std::cout
返回
值
:" 下载失败!\n"; return -1; } std::cout
返回
值
:" 下载成功!\n"; return 0; }
HRESULT
返回
值
HRESULT
返回
值
HRESULT
返回
值
说明 如果函数正常执行,则
返回
S_OK,同时真正的函数运行结果则通过参数指针
返回
。如果遇到了异常情况,则COM系统经过
判断
,会
返回
相应的错误
值
。
HRESULT
返回
值
说明(转)
HRESULT
返回
值
说明 如果函数正常执行,则
返回
S_OK,同时真正的函数运行结果则通过参数指针
返回
。如果遇到了异常情况,则COM系统经过
判断
,会
返回
相应的错误
值
。
HRESULT
值
含义 S_OK 0x00000000 成功 S_...
ATL
3,245
社区成员
48,537
社区内容
发帖
与我相关
我的任务
ATL
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
复制链接
扫一扫
分享
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章