【问题标题】:Regarding SafeArrayPutElement关于 SafeArrayPutElement
【发布时间】:2012-02-06 19:04:57
【问题描述】:

仅供参考,我是 COM\ATL 和 unicode 的初学者

我在我的代码中使用SafeArrayPutElement(safearray*,LONG,void*),问题是......

在这里,当我将第三个参数指定为 L"ItWorks" 时,该函数可以正常工作 即

SafeArrayPutElement(safearray*,LONG, L"ItWorks");

但是如果我使用

wchar_t str;
str = 'a';
SafeArrayPutElement(safearray*,LONG,&str);

这个函数失败说E_OUTOFMEMORY

我的需要是,我在char* 变量中有一个字符串,我需要如何将其用作上述函数的第三个参数。 任何人都可以在这方面帮助我。

TIA

纳温

【问题讨论】:

  • 发布真实代码,将 safearray* 和 LONG 传递给函数永远无法编译。 SAFEARRAY 中的字符串必须是 BSTR,而不是 wchar_t。

标签: c unicode atlcom


【解决方案1】:

BSTR 中唯一可以在 COM 中安全使用的字符串类型,而不是原始的 wchar_t*。这是因为BSTR 包含 COM 用于编组目的的额外内部数据。使用SysAllocString()SysAllocStringLen()wchar_t* 中分配一个新的BSTR,然后在使用完毕后使用SysFreeString() 释放它,例如:

BSTR bstr = SysAllocString(L"ItWorks");
SafeArrayPutElement(..., bstr);
SysFreeString(bstr);

.

wchar_t str = L'a'; 
BSTR bstr = SysAllocStringLen(&str, 1);
SafeArrayPutElement(..., bstr);
SysFreeString(bstr); 

【讨论】:

  • 感谢您的回复,这是 L'a' 中 'L' 的替代品,因为我已经在变量中有一个字符串,所以如何转换它
  • 你使用什么样的变量?我向您展示了如何转换wchar_twchar_t*。你在用别的东西吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-20
  • 1970-01-01
  • 2012-01-19
  • 2021-07-09
  • 2017-01-08
  • 2018-01-18
  • 2011-09-08
相关资源
最近更新 更多