從書ATL內部,我知道BSTR是不同於OLECHAR *,並且有BSTR的CComBSTR和CString。我們可以把COM中的BSTR類型作爲值還是參考?
根據MSDN Allocating and Releasing Memory for a BSTR,我知道主叫/被叫的內存管理責任。
走這條線從MSDN,
HRESULT CMyWebBrowser::put_StatusText(BSTR bstr)
我仍然不知道如何在我的實現處理bstr
正常。由於我仍然有BSTR的一個基本問題 - 我們應該將bstr
作爲一個值(如int)還是作爲引用(如int *),至少在COM接口邊界上。
我想在我的實現中儘快將BSTR轉換爲CString/CComBSTR。值或引用語義對於轉換來說是完全不同的情況。我已經深入CComBSTR.Attach,CComBSTR.AssignBSTR等,但代碼無法解決我的疑惑。
MSDN CComBSTR.Attach有一些代碼片斷,我覺得它是錯誤的,因爲它不服從Allocating and Releasing Memory for a BSTR。 ATL Internals表示SetSysString會'釋放原來傳入的BSTR',如果我使用它,它將違反BSTR參數約定,就像CComBSTR.Attach一樣。
總而言之,我想使用CString來處理原始BSTR的實現,但不知道正確的方法......我在項目中編寫了一些只是工作代碼,但我總是感到緊張,因爲我不知道不知道我是否正確。
讓我談談編碼語言
HRESULT CMyWebBrowser::put_StatusText(BSTR bstr)
{
// What I do NOT know
CString str1; // 1. copy bstr (with embeded NUL)
CString str2; // 2. ref bstr
// What I know
CComBSTR cbstr1;
cbstr1.AssignBSTR(bstr); // 3. copy bstr
CComBSTR cbstr2;
cbstr2.Attach(bstr); // 4. ref bstr, do not copy
// What I do NOT know
// Should we copy or ref bstr ???
}
我的大問題是我們應該複製或參考bstr?小qeustion是如何使用CString參考bstr?如何用嵌入的NULL複製bstr? – Raymond 2013-03-15 20:51:50
複製或參考是什麼意思?如果它是一個輸入參數通過'BSTR'通過值,否則通過「指針」'BSTR *'通過。如果你嵌入了'NUL',你可以將它複製到'std :: wstring'中,而不是'CString'中。 – 2013-03-15 21:24:55
也許你從一個錯誤的觀點來看待問題......想像一個''const' wchar_t *'分配一個特殊的COM分配器,長度爲前綴(因此它可以嵌入'NUL's )。 – 2013-03-15 21:53:27