Von Buch ATL Internals wusste ich, dass BSTR unterscheidet sich von OLECHAR *, und es gibt CComBSTR und CString für BSTR.Sollen wir BSTR-Typ in COM als Wert oder Referenz behandeln?
Nach MSDN Allocating and Releasing Memory for a BSTR wusste ich Speicherverwaltung Verantwortung für Anrufer/Angerufener.
Nehmen Sie diese Linie von MSDN,
HRESULT CMyWebBrowser::put_StatusText(BSTR bstr)
Ich weiß noch nicht, wie bstr
richtig in meiner Implementierung zu behandeln. Da ich noch eine grundlegende Frage für BSTR habe - sollten wir bstr
als Wert behandeln (wie int) oder als Referenz (wie int *), zumindest auf der COM-Schnittstellengrenze.
Ich möchte BSTR so schnell wie möglich zu CString/CComBSTR in meiner Implementierung konvertieren. Die Wert- oder Referenzsemantik wird für die Konvertierung völlig unterschiedlich sein. Ich habe in CComBSTR.Attach, CComBSTR.AssignBSTR usw. gegraben. Aber der Code kann meine Zweifel nicht lösen.
MSDN CComBSTR.Attach hat einige Code-Schnipsel, ich denke, es ist falsch, da es nicht gehorcht Allocating and Releasing Memory for a BSTR. ATL Internals sagte, dass SetSysString "den ursprünglichen BSTR freigibt", wenn ich es benutze, wird es die BSTR-Argumentkonvention genau wie CComBSTR.Attach verletzen.
Alles in allem möchte ich CString verwenden, um rohe BSTR in der Implementierung zu handhaben, aber nicht den richtigen Weg ... Ich habe gerade Arbeitscode in meinen Projekten geschrieben, aber ich fühle mich immer nervös, seit ich nicht mehr Ich weiß nicht, ob ich Recht habe.
mir reden lassen Sprache Codierung
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 ???
}
Meine große Frage ist, sollten wir kopieren oder ref bstr? Kleine Frage ist, wie man bstr mit CString referenziert? Wie kopiert man bstr mit eingebettetem NULL? – Raymond
Was meinst du mit Kopie oder Ref? Wenn es eine Eingabe param Pass 'BSTR' nach Wert, sonst pass "durch den Zeiger"' BSTR * '. Wenn Sie eingebettet haben 'NUL's können Sie es in einem' std :: wstring' kopieren, nicht in einem 'CString'. –
Vielleicht beobachten Sie das Problem aus einer falschen Sicht ... Denken Sie an eine 'BSTR' wie ein' const wchar_t * 'mit einem speziellen COM allocator zugeordnet und längen Präfix (so kann es eingebettet haben' NUL's). –