Dal libro ATL Internals, sapevo che BSTR è diverso da OLECHAR * e ci sono CComBSTR e CString per BSTR.Trattiamo il tipo di BSTR in COM come valore o riferimento?
Secondo MSDN Allocating and Releasing Memory for a BSTR, conoscevo la responsabilità di gestione della memoria per il chiamante/chiamato.
Prendere questa linea da MSDN,
HRESULT CMyWebBrowser::put_StatusText(BSTR bstr)
io ancora non so come gestire correttamente bstr
nella mia implementazione. Poiché ho ancora una domanda di base per BSTR - dovremmo trattare bstr
come un valore (come int) o come riferimento (come int *), almeno sul limite dell'interfaccia COM.
Voglio convertire BSTR il più presto possibile a CString/CComBSTR nella mia implementazione. La semantica di valore o di riferimento sarà totalmente diversa per la conversione. Ho inserito CComBSTR.Attach, CComBSTR.AssignBSTR, ecc. Ma il codice non può risolvere i miei dubbi.
MSDN CComBSTR.Attach ha qualche codice di snip, mi sembra che sia sbagliato poiché non è conforme allo Allocating and Releasing Memory for a BSTR. ATL Internals ha detto che SetSysString "libererà il BSTR originale passato", se lo usassi, violerebbe la convenzione dell'argomento BSTR, proprio come CComBSTR.Attach.
Tutto sommato, voglio utilizzare CString per gestire BSTR raw in fase di implementazione, ma non conosco il modo corretto ... Ho scritto alcuni codice di lavoro nei miei progetti, ma mi sento sempre nervoso da quando non lo faccio Non so se ho ragione.
Fammi parlare una marcatura di lingua
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 ???
}
La mia grande domanda è Dovremmo copiare o ref bstr? La piccola qeustion è come refstrare con CString? come copiare bstr con NULL incorporato? – Raymond
Cosa intendi con copia o ref? Se è un parametro di ingresso, passa 'BSTR' per valore, altrimenti passa" per puntatore "' BSTR * '. Se hai incorporato 'NUL's puoi copiarlo in' std :: wstring', non in un 'CString'. –
Forse stai osservando il problema da un punto di vista sbagliato ... Pensa a un 'BSTR' come un' const wchar_t * 'allocato con uno speciale allocatore COM, e prefissato in lunghezza (quindi può avere incorporato' NUL's). –