循环内的 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");
我需要操纵 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");