我正在用C ++编写Windows控制台应用程序,并希望在成功时返回零,并在失败时返回有意义的错误代码(即S_OK
应该返回0,E_OUTOFMEMORY
应该返回不同的返回值比E_FAIL
等等。以下是一个好的方法吗?:
int wmain(int argc, wchar_t *argv[])
{
HRESULT hr = DoSomething();
return (int) hr;
}
还是有更好的方法吗?也许是我忘记或无法找到的标准Win32 API函数或宏?
答案 0 :(得分:7)
OP希望返回值为零以表示成功。有成功代码非零,所以......
if ( SUCCEEDED( hr ) )
return 0;
return hr;
答案 1 :(得分:4)
HRESULT
只是一个32位整数,每个代码都是不同的值,所以what you are doing is what you want。
答案 2 :(得分:3)
存在隐式转换,因此无需转换。
(更不幸的是,还有一个隐式转换为bool
和Win32 BOOL
typedef,因此S_OK
转换为false,所有其他值(包括错误)转换为为true - COM程序中常见的错误来源。)
答案 3 :(得分:2)
“更好的方法”是使用C ++样式:
HRESULT hr = DoSomething();
return static_cast<int>(hr);
否则,like Steve said,它只是一个整数。它定义为long
,而不是int
,但不是从HRESULT
转换为long
到int
,您显然可以在一个机动。
(也就是说,windows.h
假设long
将是一个32位整数,这是C&amp; C ++标准所不能保证的。但这就是事情的进展,我假设。)
更好的是,这根本不需要演员。