请教SUCCEEDED宏的用法问题

shelliu 2007-12-27 09:15:24
我在教程上看到好像SUCCEEDED宏是判断一个HRESULT结果是否为真,我现在编写一个涉及ADO的程序,我在MyApp类的InitialInstance中先初始化COM库并建立连接,其代码如下:
//初始化COM库并建立数据库连接
HRESULT hr=OleInitialize(NULL);
if(!SUCCEEDED(hr))
return FALSE;
//实例化pConn并建立连接
_bstr_t connStr=TEXT("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=诊所药品管理系统.mdb;Persist Security Info=False");
try
{
hr = m_pConn.CreateInstance(__uuidof(Connection));
if(!SUCCEEDED(hr))
throw;
m_pConn->ConnectionString=connStr;
hr = m_pConn->Open(TEXT(""),TEXT(""),TEXT(""),adModeUnknown);
if(!SUCCEEDED(hr))
throw;
}
catch(_com_error &e)
{
CString str=TEXT("对不起,数据库连接失败,错误信息为:\n\n--");
AfxMessageBox(str+e.ErrorMessage());
hr = S_FALSE;
}

if(!SUCCEEDED(hr))
return FALSE;


我的目的是希望如果建立连接失败则让程序提示用户后退出,开始运行时程序没有提示,直接启动了,后来我把数据库移到别的目录,迫使不能建立连接,程序果然出现提示框,但并未退出。由于之前有一次在一个程序中对SUCCEEDED宏有点不好的映象,所以我把最后一句改为if(SUCCEEDED(hr)) return FALSE;结果提示后程序就退出了。
我查了一下该宏的定义:
#define SUCCEEDED(Status) ((HRESULT)(Status) >= 0)
然后又查了一下S_OK和S_FALSE的定义:
#define S_OK ((HRESULT)0x00000000L)
#define S_FALSE ((HRESULT)0x00000001L)
这么说来好像无论hr是S_OK还是S_FALSE,其结果都是TRUE,但我看到大部分教程上的用法都是判断如果hr是S_OK则SUCCEED返回TRUE,而S_FALSE则返回FALSE,所以我比较迷惑,请哪位高手帮忙解释一下,谢谢!

...全文
1076 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jameshooo 2007-12-29
  • 打赏
  • 举报
回复
如果你确实这样做了,在单步跟踪过程中必然有一个步骤返回的HRESULT是失败值,基本上应该在Connect操作的时候就返回失败。
shelliu 2007-12-29
  • 打赏
  • 举报
回复
还是我太笨了,用if(SUCCEEDED(S_OK))和if(SUCCEEDED(S_FALSE))测试了一下,证明楼上几位说的是正确的,我的函数返回值是与其他数据库连接的原因有关,谢谢各位的解答!
shelliu 2007-12-29
  • 打赏
  • 举报
回复
回胡柏华:我是把数据库移到别的目录,从操作系统下移动的,怎么会不成功呢?
shelliu 2007-12-28
  • 打赏
  • 举报
回复
奇怪,我把数据库移开了,m_pConn->open返回值却还是0,说明是S_OK,怎么会出现这种情况呢?
jameshooo 2007-12-28
  • 打赏
  • 举报
回复
应该单步跟踪进去,检查每一个COM调用的返回值。也许你转移数据库的操作并未成功
Waiting4you 2007-12-27
  • 打赏
  • 举报
回复
比如编一个函数bool IsMen(),不管返回是true还是false都属于函数执行成功了,只有遇到异常时(比如在判定时正好在变性手术中,线程不安全,呵呵)才能叫失败.

相对应上面的就是S_OK,S_FALSE了,它们都表示函数执行成功了,只是返回值不同而已.如果遇到一些不正常的状态(比如输入类型不对,函数没有实现,媒体读写失败等)就会返回E_FAIL(不仅限于E_开头,有些是xxxx_E_开头)之类的最高bit为1的结果,这个才是失败.SUCCEEDED就是用于检测这类失败的.

shelliu 2007-12-27
  • 打赏
  • 举报
回复
但是我把最后一句改成if(SUCCEEDED(hr)) return FALSE;后,程序退出,说明这时SUCCEED(hr) 返回的是TRUE;
jameshooo 2007-12-27
  • 打赏
  • 举报
回复
S_开头的都属于成功,E_开头的都属于失败。S_FALSE是一个成功的特例,它可以代表另一个成功的状态值

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧