【问题标题】:BSTR string manipulation within a loop [duplicate]循环内的BSTR字符串操作[重复]
【发布时间】:2015-10-19 09:47:22
【问题描述】:

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

我怎样才能完成任务?

【问题讨论】:

    标签: c# c++ string interop


    【解决方案1】:

    将初始化更改为

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

    【讨论】:

    • 最后一个没注意(;谢谢!
    【解决方案2】:

    问题在于 pks[i].StrVal = L"abcdefghij" 只是将 BSTR 指向一个字符串文字,它不会复制 BSTR 中的值,此外 BSTR 虽然类型定义为 whar_t* 不会表现得像一个 C 字符串。要使用BSTR,您必须将自己限制为Sys... 系列函数(例如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 为串联提供了另一种替代方案。

    【讨论】:

    • 感谢您提供的优秀示例代码,我不了解您提到的所有类型,并且在查看替代方案时,很高兴CComBSTR 无需分配即可使用。尽管哪种方法更便宜,因为我可能会将它们编组到托管代码中,由它们中的 M 个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 2020-09-13
    • 2015-01-25
    • 1970-01-01
    相关资源
    最近更新 更多