2015-10-19 88 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的 –