M.M*_*M.M 6 c++ bstr c++builder
当调用需要 BSTR 的函数时,最好能够编写如下内容:
iFoo->function( bs"HELLO" );
Run Code Online (Sandbox Code Playgroud)
然而,我知道的唯一解决方法是使用调用SysAllocString等的包装器,例如:
iFoo->function( WideString(L"HELLO").c_bstr() );
Run Code Online (Sandbox Code Playgroud)
这有点丑陋。实际上有这样的选项来创建BSTR文字吗?
动机:通过避免分配和释放,代码更易于阅读,运行时性能更快。
澄清:我只讨论调用者(即我们)拥有 BSTR 所有权的情况,例如:调用带有BSTR [in]参数的函数。当然,向函数提供指向 BSTR 文字的指针是愚蠢的,该函数将继续尝试释放字符串。
为了跟进 @MSalters 的答案,自定义用户定义的文字可能如下所示:
CComBSTR operator "" _bstr (const char* str, std::size_t len)
{
return CComBSTR(len, str);
}
Run Code Online (Sandbox Code Playgroud)
然后你可以这样做(因为定义CComBSTR了BSTR转换运算符):
iFoo->function( "HELLO"_bstr );
Run Code Online (Sandbox Code Playgroud)
您甚至可以为多个输入字符串文字类型重载运算符:
CComBSTR operator "" _bstr (const wchar_t* str, std::size_t len)
{
return CComBSTR(len, str);
}
CComBSTR operator "" _bstr (const char16_t* str, std::size_t len)
{
return CComBSTR(len, (wchar_t*)str);
}
Run Code Online (Sandbox Code Playgroud)
iFoo->function( L"HELLO"_bstr ); // calls wchar_t* version with UTF-16 encoded data
iFoo->function( u"HELLO"_bstr ); // calls char16_t* version with UTF-16 encoded data
iFoo->function( u8"HELLO"_bstr ); // calls char* version with UTF-8 encoded data...
Run Code Online (Sandbox Code Playgroud)
请注意最后一种情况。由于操作员不知道传递的是 ANSI 还是 UTF-8 数据,并且CComBSTR在传递char*数据时假定为 ANSI,因此您应该使用不同的文字后缀来区分,以便可以正确转换 UTF-8,例如:
CComBSTR operator "" _utf8bstr (const char* str, std::size_t len)
{
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> conv;
std::wstring wstr = conv.from_bytes(std::string(str, len));
return CComBSTR(wstr.length(), wstr.c_str());
}
iFoo->function( u8"HELLO"_utf8bstr );
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1935 次 |
| 最近记录: |