作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个注册为 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/
我有一个注册为 COM 对象的 .net 库,当在 C++ 项目中导入 .tlb 文件时,我得到这样的方法声明 virtual HRESULT __stdcall GetBid ( /*[
我是一名优秀的程序员,十分优秀!