循环中的BSTR字符串操作

时间:2015-10-19 09:47:23

标签: c# c++ string interop

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

我该如何完成任务?

2 个答案:

答案 0 :(得分:1)

问题是pks[i].StrVal = L"abcdefghij"只是将BSTR指向一个字符串文字,除了BSTR同时输入BSTR之外,它不会复制whar_t*中的值。到Sys...的行为不像C字符串。要使用BSTR,您必须将自己限制在pks[i].StrVal = SysAllocString(L"abcdefghij"); 系列函数(例如SysAllocString)或者如果ATL可用,请使用它。初始化和分配字符串;

for

单独查看CComBSTR temp(L"abcdefghi"); temp += std::to_wstring(i).c_str(); pks[i].StrVal = temp.Detach(); 循环(即不按上述方式分配),可以使用ATL::CComBSTR轻松完成连接;

 setlocal enableDelayedExpansion
 for  %%j in (C:\Users\*) do (
 SET _test=123456789abcdef0
  SET _result=!_test:~0,5!
 ECHO !_result!          =12345
 )

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

答案 1 :(得分:1)

将init更改为

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