c++, Win32 LoadString wrapper

c++, Win32 LoadString wrapper

本文关键字:wrapper LoadString Win32 c++      更新时间:2023-10-16

我想听听您对LoadString Win32函数的包装器的意见。

int LoadWString( HINSTANCE hInstance_In, UINT uID_In, std::wstring &str_Out ){
    return LoadStringW( hInstance_In, uID_In, (LPWSTR)str_Out.c_str(), (int)str_Out.max_size());
}

似乎如预期的那样工作,问题更多的是关于使用字符串max_size属性作为缓冲区大小,这是否有一些负面的缺点?

c_str()返回一个不可修改的指针。它不能被写入。抛掉const-ness并写入受控序列将导致未定义行为

相反,只需查询指向资源部分的指针和字符串长度,并在此数据上构造一个新的std::wstring对象:

std::wstring LoadStringW( unsigned int id )
{
    const wchar_t* p = nullptr;
    int len = ::LoadStringW( nullptr, id, reinterpret_cast<LPWSTR>( &p ), 0 );
    if ( len > 0 )
    {
        return std::wstring{ p, static_cast<size_t>( len ) };
    }
    // Return empty string; optionally replace with throwing an exception.
    return std::wstring{};
}

有几点值得注意:

  • 实现使用LoadString,为nBufferMax传递0。这样做将返回一个指向资源节的指针;没有执行额外的内存分配:

nBufferMax :
如果该参数为0,则lpBuffer接收到一个指向资源本身的只读指针。

  • 字符串资源统计字符串,可以嵌入NUL字符。这要求使用带有显式长度参数的std::string构造函数。return std::wstring(p);可能会截断返回的字符串。
  • 由于字符串资源的布局,通常无法判断任何给定ID的字符串资源是否为空或不存在。此答案中的实现也遵循此方法,如果字符串资源为空或不存在,则返回空字符串。