如何将Win32 HRESULT转换为int返回值?

时间:2009-08-02 07:40:48

标签: c++ windows winapi

我正在用C ++编写Windows控制台应用程序,并希望在成功时返回零,并在失败时返回有意义的错误代码(即S_OK应该返回0,E_OUTOFMEMORY应该返回不同的返回值比E_FAIL等等。以下是一个好的方法吗?:

int wmain(int argc, wchar_t *argv[])
{
    HRESULT hr = DoSomething();
    return (int) hr;
}

还是有更好的方法吗?也许是我忘记或无法找到的标准Win32 API函数或宏?

4 个答案:

答案 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转换为longint,您显然可以在一个机动。

(也就是说,windows.h假设long将是一个32位整数,这是C&amp; C ++标准所不能保证的。但这就是事情的进展,我假设。)


更好的是,这根本不需要演员。