我需要操纵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';
}
我该如何完成任务?
答案 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");