请教SUCCEEDED宏的用法问题
我在教程上看到好像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,所以我比较迷惑,请哪位高手帮忙解释一下,谢谢!