[C con Clase] Error en CryptStringToBinary usando wchar

Davidson, Steven srd4121 en njit.edu
Sab Mar 30 17:05:42 CET 2013


Hola Miguel,

2013/3/29 miguel Fernandez <mafolongo en hotmail.com>

> Buenas tardes amigos, soy nuevo en la programación de c++, sin embargo
> tengo tiempo en las listas de correo de cconclase, esta es la primera vez
> que escribo así que espero y agradezco que sepan perdonar mis errores...
> Mi problema está ocurriendo al tratar de Convertir una cadena de texto
> extremadamente larga (461 carácteres) a hexadecimal usando
> CryptStringToBinary... el problema es que debido a la cantidad de
> carácteres debo utilizar WCHAR para almacenar dicha cadena... lo que me
> arroja el siguiente error:
>
> [Error] cannot convert 'WCHAR* {aka wchar_t*}' to 'LPCSTR {aka const
> char*}' for argument '1' to 'WINBOOL CryptStringToBinaryA(LPCSTR, DWORD,
> DWORD, BYTE*, DWORD*, DWORD*, DWORD*)'
>
> Como soy nuevo no estoy muy familiarizado con los errores y cómo
> solucinarlos todos... ¿Qué puedo hacer para solucionar el problema?
>
>
El error está en que usas la función 'CryptStringToBinaryA()', pero le
pasas una cadena de Unicode (representado por 'WCHAR'), cuando esperaba una
cadena de tipo ASCII (representado por 'CHAR'). En MS-Windows, la gran
mayoría de las funciones es macros. Cada macro se basa en parejas de
funciones al estilo de: 'xxxxA()' para la versión ASCII y 'xxxxW()' para la
versión de Unicode, que usa 'WCHAR' para representar cada carácter de
Unicode.

La solución es indicar previamente que quieres compilar tu código fuente
como Unicode. La forma más sencilla es #definiendo la constante simbólica
UNICODE al comienzo del fichero de cabecera, y antes de #incluir los
ficheros de cabecera del API de MS-Windows. Por ejemplo,

#define UNICODE
#include <windows.h>
...

Ahora todas esas macros se definirán con las versiones Unicode, y así no
tienes que "tocar" el resto de tu código fuente.

A continuación expongo un extracto del código:
>
>     BOOL bIsSuccess = FALSE;
>     WCHAR szKey[] = L"01000000D08C9DDF0115D1118C7A00C04FC297EB01000...";
>

Cuando quieras usar caracteres literales en MS-Windows, sugiero que uses la
macro TEXT(), que se basa en la misma idea mencionada previamente: se
elegirá la versión ASCII o la versión Unicode. Esto sería,

TCHAR szKey[] = TEXT( "01000000D08C9DDF0115D1118C7A00C04FC297EB01000..." );

El tipo 'TCHAR' es otra macro que cambiará según si usemos ASCII o Unicode.

Obviamente, si sabemos que DEBE ser Unicode, entonces no uses estas macros
ni tipos, por lo que debes asegurarte de que el código fuente use la
versión Unicode de todas sus funciones.


Espero que esto te ayude.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130330/6f01a071/attachment.html>


Más información sobre la lista de distribución Cconclase