函数返回std :: wstring = NULL;

use*_*rbb 3 c++ error-handling exception-handling

我试图为winapi函数制作包装器GetWindowText.函数返回std :: wstring,但我不知道如何处理错误发生的地方.我返回NULL但我知道这是错的.

std::wstring GetWindowText(HWND handle)
{
    const int size = 1024;
    TCHAR wnd_text[size] = {0};

    HRESULT hr = ::GetWindowText(handle,
                    wnd_text, size);
    if(SUCCEEDED(hr))
        return std::wstring(wnd_text);
    else
        return NULL;    
}
Run Code Online (Sandbox Code Playgroud)

小智 7

而是抛出异常.

std::wstring GetWindowText(HWND handle)
{
    const int size = 1024;
    TCHAR wnd_text[size] = {0};

    HRESULT hr = ::GetWindowText(handle,
                    wnd_text, size);
    if(SUCCEEDED(hr))
        return std::wstring(wnd_text);
    else
        throw std::runtime_error("insert error message here");    
}
Run Code Online (Sandbox Code Playgroud)

  • @Mihran:这是一个*C++*包装器,所以它在C++习语中转换WinAPI习语是正确的.如果它在特定的异常类型中封装了`GetLastError`值会更好. (5认同)

Tro*_*our 5

作为异常的替代,您还可以在参数列表中通过引用返回字符串,并通过返回true或false来表示成功

bool GetWindowText(HWND handle, std::wstring& windowText)
{
    const int size = 1024;
    TCHAR wnd_text[size] = {0};

    HRESULT hr = ::GetWindowText(handle,
                    wnd_text, size);
    if(SUCCEEDED(hr))
    {
        windowText = wnd_text;
        return true;
    }
    else
        return false;    
}
Run Code Online (Sandbox Code Playgroud)

避免引用参数的另一个替代方法是返回包装值的类的实例,但也让您知道值是否存在,例如

class ValueWrapper
{
public:
    ValueWrapper() : present( false ) {}
    ValueWrapper( const std::wstring& s ) : value( s ), present( true ) {}

    bool isPresent() const { return present; }
    const std::wstring& getValue() const { return value; }

private:
    std::wstring value;
    bool present;
};
Run Code Online (Sandbox Code Playgroud)

请注意,您可以非常轻松地模拟此包装器.那么你的功能就是

ValueWrapper GetWindowText(HWND handle)
{
    const int size = 1024;
    TCHAR wnd_text[size] = {0};

    HRESULT hr = ::GetWindowText(handle,
                    wnd_text, size);
    if(SUCCEEDED(hr))
        return ValueWrapper( wnd_text );
    else
        return ValueWrapper();
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,[`boost :: optional <>`](http://www.boost.org/doc/libs/release/libs/optional/doc/html/index.html)是`ValueWrapper的预先存在的,经过测试的实现`. (2认同)