循环内的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字符串操作[重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 64 位平台上 BSTR 长度前缀为 4 个字节?

循环计数字符串值[重复]

读阿里规约有感循环体内的字符串连接时,使用StringBuilder的append()和+String的方式比较

在while循环中动态回显字符串[重复]

_bstr_t 到 UTF-8 可能吗?

BSTR详解