循环内的BSTR字符串操作[重复]
Posted
技术标签:
【中文标题】循环内的BSTR字符串操作[重复]【英文标题】:BSTR string manipulation within a loop [duplicate] 【发布时间】:2015-10-19 09:47:22 【问题描述】:我需要操作StrVal
,因为struct
被编组到托管C#。我正在尝试使用BSTR
字符串类型,因为它可以保存内存分配操作,但我不熟悉非托管数据类型。问题是我没有看到对值所做的任何更改。
typedef struct
int Id;
BSTR StrVal;
packet;
packet pks [5];
// ...
pks[i].StrVal = L"abcdefghij";
for (int i = 0; i < 10; i++)
pks[i]=i;
//pks[i].StrVal = SysAllocString(L"abcdefghi"+i);
pks[i].StrVal[9]=i+'0';
我怎样才能完成任务?
【问题讨论】:
【参考方案1】:将初始化更改为
pks[i].StrVal = SysAllocString(L"abcdefghij");
【讨论】:
最后一个没注意(;谢谢!【参考方案2】:问题在于 pks[i].StrVal = L"abcdefghij"
只是将 BSTR 指向一个字符串文字,它不会复制 BSTR
中的值,此外 BSTR
虽然类型定义为 whar_t*
不会表现得像一个 C 字符串。要使用BSTR
,您必须将自己限制为Sys...
系列函数(例如SysAllocString
),或者如果ATL 可用,则使用它。初始化和分配字符串;
pks[i].StrVal = SysAllocString(L"abcdefghij");
单独查看for
循环(即不按上述分配),可以使用ATL::CComBSTR
轻松完成连接;
CComBSTR temp(L"abcdefghi");
temp += std::to_wstring(i).c_str();
pks[i].StrVal = temp.Detach();
VarBstrCat
为串联提供了另一种替代方案。
【讨论】:
感谢您提供的优秀示例代码,我不了解您提到的所有类型,并且在查看替代方案时,很高兴CComBSTR
无需分配即可使用。尽管哪种方法更便宜,因为我可能会将它们编组到托管代码中,由它们中的 M 个以上是关于循环内的BSTR字符串操作[重复]的主要内容,如果未能解决你的问题,请参考以下文章