如何在C++中使用 HRESULT 条件检查


HRESULT hr = S_OK; //initialization`
if (int i == 5)
{
hr = 1; //Is it correct usage?  
}
if (hr == 1)
cout<<"The value of i is 5";

正如我一直听到HRESULT输出E_TIMEOUT等字符串一样,使用我使用的数字是否正确。

这里的主要问题是你用HRESULT做什么?

显然,您可以为HRESULT分配任何值,但是为什么不直接使用int呢?

HRESULT用作传达函数调用成功或失败的一种方式。通常,HRESULT要么是S_OK(0(要么是错误(负数(。S_FALSE(1,不是失败,但也不是成功(很少使用。

与 COM 或 .NET 一起使用时,调用方通常只检查函数是成功还是失败。默认情况下,封送返回HRESULT的函数时。NET 的编组器会将函数转换为void函数,如果结果为负数,则抛出异常,如果结果为非负数,则丢弃结果。

如果您的代码是这种情况,那么给出特定的正值是没有意义的。如果您不使用它来实现互操作性,您可能根本不应该使用HRESULT

0S_OK的HRESULT是标准的"成功"代码。 而1是S_FALSE,这意味着,"成功,但我并没有完全按照你的要求去做,因为它可能已经完成了"。

标准模式更接近于此:

HRESULT hr = S_OK //initialization

if (int i == 5)
{
hr = S_OK;    
}
else
{
hr = E_INVALIDARG;  // Or any E_ error code
}
if (SUCCEEDED(hr))
{
cout<<"The value of i is 5";
}
else if (hr == E_INVALIDARG)
{
// handle specific error
}
else
{
// handle all other errors generically
}

基本上,一切都在''中。但是,我有这种感觉,这可能不是一个流行的答案。

背景

HRESULT 是从 Windows SDK 的浩瀚海洋中的 Win32、COM 和其他函数返回的句柄(长整型值(。该手柄中包装的内容和方式在<winerror.h>中进行了解释

我可能敢认为Win32有一个事实对C++开发人员非常有用。

Win32 是用 C 语言编写的

因此,没有C++例外。同上,HRESULT是你的朋友。有一些"特殊例外"称为SEH(结构化异常处理(。它们被"内置"到Windows中。甚至 MS STL 在关闭 c++ 异常时也使用 SEH(喘气!但这不是问题的一部分。

用法看起来很简单:

HRESULT hr ;
ULONG  ansi_size_  ;
hr = DiscpUnicodeToAnsiSize(L"Look Ma, I am doing WIN32!", &ansi_size_ );
if ( FAILED(hr) ) {
//  there was some error
//  what exactly has happened?
HRESULT facility = HRESULT_FACILITY(hr);
HRESULT severity = HRESULT_SEVERITY(hr);
// we can for example look for a particular facility 
if ( facility  == FACILITY_MSMQ) 
{
// hey, just what is MSMQ ?!
// let see the code part
HRESULT code = HRESULT_CODE(hr);
}
}

<winerror.h>(目前(有62238行长。随意浏览它,你会发现很多有用的金块。

维基百科关于HRESULT的文章实际上简短而中肯。

Win32 现在已经有几十年的历史了。不可避免地有尘土飞扬的角落。但HRESULT将"永远"保持并处于积极发展状态。

碰巧的是,Windows错误代码协议修订版20(喘息(昨天刚刚发布!

但那是C!?

很少有官方项目(也已发布(将HRESULT和COM"封装"到C++类型中。MFC, ATL ...我最喜欢的是编译器COM支持,特别是_com_error类。

我希望这有所帮助...

最新更新