2015-10-19 77 views
-1

我需要操作StrVal,因为struct被编组为托管C#。我试图使用BSTR字符串类型,因为它保存了内存分配操作,但我对不受管理的数据类型不熟悉。问题是我没有看到对该值做出任何更改。循环内的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

更改init进程

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

没有注意最后一个(;谢谢! –

1

的问题是,pks[i].StrVal = L"abcdefghij"只是点的BSTR到一个字符串字面量,它不会在BSTR复制的价值,除了事实BSTR同时通过typedef到whar_t*并不像一个C字符串。要使用BSTR,您必须将自己限制为Sys...函数族(例如SysAllocString),或者如果ATL可用,请使用该函数。初始化和分配字符串;

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

单独在for循环寻找(即如上不分配),则级联可以很容易地与ATL::CComBSTR进行;

VarBstrCat为连接提供了另一种替代方案。

+0

感谢你的好示例代码,我没有你提到的所有类型的knowlage,并在审查的选择,这是很好的'CComBSTR'让使用不分配。尽管哪种方法更便宜,因为我可能会管理代码,由M的 –