C# 循环中的BSTR字符串操作

C# 循环中的BSTR字符串操作,c#,c++,string,interop,C#,C++,String,Interop,我需要操纵StrVal,因为struct被编组到托管C。我试图使用BSTRstring类型,因为它保存内存分配操作,但我不熟悉非托管数据类型。问题是我看不到对值进行任何更改 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;

我需要操纵
StrVal
,因为
struct
被编组到托管C。我试图使用
BSTR
string类型,因为它保存内存分配操作,但我不熟悉非托管数据类型。问题是我看不到对值进行任何更改

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';
 }
typedef结构{
int-Id;
BSTR标准;
}包;
数据包pks[5];
// ...
pks[i].StrVal=L“abcdefghij”;
对于(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\u t*
时,它的行为与C字符串不同。要使用,您必须将自己限制在
Sys…
功能系列(例如),或者如果ATL可用,请使用该系列。初始化并分配字符串

pks[i].StrVal = SysAllocString(L"abcdefghij");
单独查看循环的(即不按上述方式分配),可以很容易地使用

为连接提供另一种替代方法。

将init更改为

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

没有注意到最后一个(;谢谢!谢谢你的好示例代码,我对你提到的所有类型都不了解,在回顾替代方案时,
CComBSTR
不进行分配就使用,这很好。尽管哪种方法成本较低,因为我可能会对托管代码进行马歇尔分析,以M为例
pks[i].StrVal = SysAllocString(L"abcdefghij");