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
。
0
或S_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类。
我希望这有所帮助...