Necesito convertir una instancia CString
en un BSTR
correctamente asignado y pasar ese BSTR
en un método COM. Para tener un código que compila y funciona de manera idéntica tanto para ANSI como para Unicode, uso CString::AllocSysString()
para convertir cualquier formato CString
en un BSTR Unicode.¿Cómo convertir mejor CString a BSTR para pasarlo como un parámetro "in" en un método COM?
Como nadie posee el BSTR devuelto, tengo que encargarme de él y liberarlo después de que la llamada se realiza de la forma más segura posible y con el menor número posible de códigos.
Actualmente uso ATL::CComBSTR
para la gestión de toda la vida:
ATL::CComBSTR converted;
converted.Attach(sourceString.AllocSysString()); //simply attaches to BSTR, doesn't reallocate it
interface->CallMethod(converted);
lo que no me gusta aquí es que necesito dos estados separados a poco construir el ATL::CComBSTR
unido al resultado de conversión.
¿Hay una manera mejor de realizar la misma tarea?
Eso definitivamente funcionará, excepto que con el uso del constructor CComBSTR tendré que verificar que la asignación de BSTR fue exitosa (CString :: AllocSysString() hace el control y lanza una excepción) y con _bstr_t tendré que ocuparme de _com_issue_error() función - anularlo o capturar _com_error lanzado desde él. – sharptooth
¿Por qué no dejar que el método llamado sea responsable de verificar la validez de sus propios argumentos? Si la asignación falla, 'CComBSTR :: m_str' será nulo. Entonces, o el método llamado verificará nulo y devolverá 'E_INVALIDARG', o no, y el mismo' catch' que ya tiene para 'CString :: AllocSysString()' puede manejar la excepción por usted. Es un modismo más limpio que realizar el control de manera explícita, imho. –
@Phil Booth: El método al que se llama podría interpretar un BSTR nulo como un caso especial. Por ejemplo, el significado podría ser "especifica un nombre de archivo, si se pasa una cadena vacía, se utiliza el nombre de archivo predeterminado". Por lo tanto, el método que se invoque podría no tener la oportunidad de saber que hay un problema. – sharptooth