gpt4 book ai didi

c# - _bstr_r 与 _T ("")

转载 作者:行者123 更新时间:2023-11-27 23:03:55 34 4
gpt4 key购买 nike

我有一个注册为 COM 对象的 .net 库,当在 C++ 项目中导入 .tlb 文件时,我得到这样的方法声明

  virtual HRESULT __stdcall GetBid (
/*[in]*/ BSTR symbol,
/*[out,retval]*/ double * pRetVal ) = 0;

对于 .NET 等价物

double GetBid(string symbol);

现在我试着这样调用它

double bid;
ptr->GetBid(_T("AAPL"), &bid);

这并没有像预期的那样工作,因为在 .NET 端,字符串参数实际上是一个空字符串。

如果我改成这样的调用

double bid;
ptr->GetBid(_bstr_t("AAPL"), &bid);

一切正常。

为什么两个调用都编译正常,但结果不同?不应该将第一个调用转换为正确的字符串编码吗?

感谢有关 BSTR 魔法的任何幕后信息:)

最佳答案

BSTR 在字符串之前有一个 32 位长度。因此,BSTR 可以包含嵌入的空值。

_T("AAPL") 创建一个带有终止空值但没有长度前缀的 wchar_t *。

虽然在幕后,两者都是 wchar_t * 所以调用编译并且没有必要的转换。你有点幸运,因为可能会发生比另一侧没有绳子更糟糕的事情。编码(marshal)拆收器可能会查看 _T("AAPL") 向后计数 32 位,并且碰巧得到一个非常长的长度值,这很糟糕。 :-)

如果参数定义为 _bstr_t,您将获得自动转换,因为这将调用 _bstr_t(wchar_t *) 构造函数。

关于c# - _bstr_r 与 _T (""),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25044772/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com