循环内的 BSTR 字符串操作

BSTR string manipulation within a loop

我需要操纵 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';
 }

如何完成任务?

问题在于 pks[i].StrVal = L"abcdefghij" 只是将 BSTR 指向字符串文字,它不会复制 BSTR 中的值,此外 BSTR而类型定义为 whar_t* 的行为不像 C 字符串。要使用 BSTR you must limit yourself to the Sys... family of functions (e.g. 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 为连接提供了另一种选择。

将初始化更改为

pks[i].StrVal = SysAllocString(L"abcdefghij");