c string com vb6 bstr

¿Cómo convertir char*a BSTR?



string com (5)

¿Cómo puedo pasar un char * de C dll a VB

Aquí está el código de muestra:

void Cfunc(char *buffer,int len) { BSTR buf_bstr = SysAllocString((BSTR)buffer); VBptr.VBfunc(buf_bstr,len); }

Esta función no funciona. En realidad, otros valores se envían al VB en lugar del valor real.

¿Podría alguien sugerir una solución?


Este es el código que escribí usando la respuesta de sharptooths

int wslen = MultiByteToWideChar(CP_ACP, 0, str, strlen(str), 0, 0); BSTR bstr = SysAllocStringLen(0, wslen); MultiByteToWideChar(CP_ACP, 0, str, strlen(str), bstr, wslen); // Use bstr here SysFreeString(bstr);

Tenga en cuenta que el uso de -1 para la longitud de la cadena hace que el terminador nulo se incluya en el resultado


Llame a MultiByteToWideChar (), luego a SysAllocString () o SysAllocStringLen ().

No olvide llamar a SysFreeString () cuando ya no necesite el BSTR.

En detalle (variante de SysAllocStringLen () - es más corto y más rápido):

  1. Llame a MultiByteToWideChar () y pase 0 como quinto y sexto parámetro. Devolverá el número de caracteres en el equivalente de Unicode de la cadena ANSI. Recuerde, la cadena ANSI puede contener cualquier carácter, no solo ASCII, por lo que cualquier intento de calcular manualmente la cantidad de caracteres Unicode dada la longitud de la cadena ANSI puede funcionar en algunos casos y no en otros.

  2. Asigne un búfer para el BSTR con SysAllocStringLen (). Pase 0 como primer parámetro y el número de caracteres Unicode como segundo parámetro. Ahora tiene un BSTR correctamente asignado pero sin inicializar. Ya tiene lugar para el cero final y este cero final se coloca correctamente.

  3. Llame a MultiByteToWideChar () por segunda vez y esta vez pase el BSTR asignado allí. La función convertirá la cadena en Unicode y copiará el resultado en el BSTR. Ahora tiene un BSTR asignado correctamente que contiene el equivalente de Unicode de su cadena ANSI.

  4. Pase el BSTR en VB. Disfrutar.

  5. Llame a SysFreeString () para desasignar el BSTR.


No tengo ninguna objeción a la respuesta de Ajryan, pero aquí hay una alternativa ...

SysAllocString está definido para tomar un parámetro de tipo OLECHAR *. Le estás dando una char *. Estos no son la misma cosa. Hay ciertas circunstancias en las que pueden ser lo mismo, pero no puedes depender de ello. Entonces, primero que todo, necesitas convertir tu char * en un OLECHAR *. Hay una macro llamada A2OLE que puede hacer esto por usted, y en esos casos donde char * y OLECHAR * son la misma cosa, la macro se compila en la nada (creo).

Vea esta página para detalles de A2OLE y sus amigos.

Ah, y lanzar tu char * a un BSTR en realidad no lo cambia, no es un BSTR ni un OLECHAR *.



en lugar de char * array, intente _tchar * array.porque Sysallocstring toma solo los caracteres Unicode en una aplicación de 32 bits.