c++, Win32 LoadString wrapper
c++, Win32 LoadString wrapper
我想听听您对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的字符串资源是否为空或不存在。此答案中的实现也遵循此方法,如果字符串资源为空或不存在,则返回空字符串。
相关文章:
- consteval wrapper vs. source_location
- OpenSSL fips in C++ wrapper Library 如何?错误:指纹不匹配
- C++ :: 安全地使用 reinterpret_cast 生成"wrapper"迭代器
- Java SWIG wrapper vs direct function calling
- C++ Wrapper for threadx RTOS?
- 传递对variadic-templates的引用使用std ::参考 - wrapper
- C++ Firebase wrapper?
- Sonarqube build wrapper for distutils
- LuaJIT 和 C++ - 调用 Table.Method() 在 loadstring/pcall 中不起作用
- Boost Python wrapper 和 OpenCv 参数错误与 cv::Mat.
- LoadString(AFX_IDP_PARSE_INT) 在 mfc exe 中失败(而不是在 dll 中)
- 如何使用"wrapper function"调用没有参数的递归函数 n 次?
- libev c++ wrapper function_thunk
- SOCI (SQL C++ wrapper) - PostgreSQL 不执行命令 (?)
- C++智能指针和指针到指针输出 API。模板化"wrapper"
- C++98 Wrapper for std::map::at()
- C# wrapper class for c++ lib dll
- win32 DLL中的C++-LoadString()不起作用
- 重写MFC应用程序的LoadString
- c++, Win32 LoadString wrapper