Ho bisogno di convertire un'istanza CString
in una BSTR
allocata correttamente e passare tale BSTR
in un metodo COM. Per avere il codice che compila e lavora indenticamente sia per ANSI che per Unicode, utilizzo CString::AllocSysString()
per convertire qualsiasi formato CString
in un BSTR Unicode.Come convertire CString in BSTR per passarlo come parametro "in" in un metodo COM?
Dal momento che nessuno possiede il BSTR restituito, devo occuparmene e rilasciarlo dopo che la chiamata è stata eseguita nel modo più sicuro possibile e con il minor numero possibile di codice.
Attualmente io uso ATL::CComBSTR
per la gestione del ciclo di vita:
ATL::CComBSTR converted;
converted.Attach(sourceString.AllocSysString()); //simply attaches to BSTR, doesn't reallocate it
interface->CallMethod(converted);
quello che non mi piace qui è che ho bisogno di due prospetti separati a poco costruire l'ATL::CComBSTR
legata al risultato conversione.
Esiste un modo migliore per eseguire lo stesso compito?
Ciò funzionerà sicuramente, tranne che con l'utilizzo del costruttore CComBSTR dovrò verificare che l'allocazione BSTR abbia avuto successo (CString :: AllocSysString() esegue il controllo e genera un'eccezione) e con _bstr_t dovrò occuparmi di Funzione _com_issue_error() - la sovrascrive o cattura _com_error da essa generata. – sharptooth
Perché non lasciare che sia il metodo chiamato a controllare la validità dei propri argomenti? Se l'allocazione fallisce, 'CComBSTR :: m_str' sarà nullo. Quindi, il metodo chiamato controllerà la presenza di null e restituirà 'E_INVALIDARG', o non lo farà e lo stesso' catch' che avete già per 'CString :: AllocSysString()' può gestire l'eccezione per voi. È un idioma più pulito rispetto a eseguire esplicitamente il controllo, imho. –
@Phil Booth: il metodo chiamato potrebbe interpretare un BSTR nullo come un caso speciale. Ad esempio, il significato potrebbe essere "specifica un nome file, se viene passata una stringa vuota viene usato il nome file predefinito". Quindi il metodo chiamato potrebbe non avere alcuna possibilità di sapere che c'è un problema. – sharptooth