【发布时间】:2021-08-24 14:17:58
【问题描述】:
我有一个简单的 DirectShow 库,并且我还有一个客户端应用程序可以调用该库中的函数。问题是某些函数接受BSTR 作为参数,但我更喜欢传递std::string 或char*。可以肯定的是,如果我使用其中一种类型,我会得到很多编译器错误。
我问了原因,有人说我不能使用它们,因为它们不像 BSTR 那样保证 ABI。
我也试过wchar_t。我将它传递给我的函数而不是 BSTR。令人惊讶的是它没有产生任何编译器错误:
std::string username = "john";
wchar_t wcstring[4] = {0};
MultiByteToWideChar(0, 0, username.c_str(), 4, wcstring, 4);
但是当我调用我的函数时:
HRESULT hr = pFoo->myDummyFunction(wcstring);
然后运行程序,它返回 E_OUTOFMEMORY 作为 HRESULT。我很想知道为什么会这样。
【问题讨论】:
-
你知道 C++ 中的字符串真的被称为 null-terminated 字符串吗?有效的字符串必须包含结尾的空终止符。
-
@Someprogrammerdude 你的意思是我应该将空终止符附加到 wcstring 的末尾?
-
docuemtation 明确警告不要将
wchar_t*用作BSTR -
@linarcx 你知道吗,字符序列
"john"需要5存储字符? -
第一个问题没有空终止符。学习使用 _bstr_t 和 CComBSTR。
_bstr_t username(L"john"); HRESULT hr = pFoo->myDummyFunction(username);