Error en CryptStringToBinary usando wchar

Iniciado por MeTaD, 30 Marzo 2013, 02:01 AM

0 Miembros y 2 Visitantes están viendo este tema.

MeTaD

Buenas tardes amigos, soy nuevo en la programación de c++, así que porfavor disculpen mi ignorancia...
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:

Citar[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?

A continuación expongo un extracto del código:

    BOOL bIsSuccess = FALSE;
    WCHAR szKey[] = L"01000000D08C9DDF0115D1118C7A00C04FC297EB01000...";
    BYTE byKey[1024];
    DWORD cbBinary, dwFlags, dwSkip;
    bIsSuccess = CryptStringToBinary (szKey, lstrlenW(szKey), CRYPT_STRING_HEX, byKey, &cbBinary, &dwSkip, &dwFlags);


Si es preciso poner el código completo solo es cuestión de pedirlo (aunque me temo que es un poco extenso)

Muchas gracias de antemano,
Metad.

BloodSharp

Cita de: MeTaD en 30 Marzo 2013, 02:01 AM
Citar[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*)'

LPCSTR no es una cadena unicode sino ansi:

typedef __nullterminated CONST CHAR *LPCSTR, *PCSTR;

Las correciones serían así sino me equivoco :P

CHAR szKey[] = "01000000D08C9DDF0115D1118C7A00C04FC297EB01000...";
...
lstrlenA(szKey)



B#



MeTaD

Cita de: IEAX en 30 Marzo 2013, 02:12 AM


LPCSTR no es una cadena unicode sino ansi:

typedef __nullterminated CONST CHAR *LPCSTR, *PCSTR;

Las correciones serían así sino me equivoco :P

CHAR szKey[] = "01000000D08C9DDF0115D1118C7A00C04FC297EB01000...";
...
lstrlenA(szKey)



B#

Gracias por tu pronta respuesta amigo, pero surge el siguiente problema:

Si no cambio lstrLenW(szKey) por lstrlenA(szKey) da el siguiente error:

Citar[Error] cannot convert 'CHAR* {aka char*}' to 'LPCWSTR {aka const wchar_t*}' for argument '1' to 'int lstrlenW(LPCWSTR)'

Luego de realizar el cambio da el siguiente error:

Citarundefined reference to `_imp__CryptStringToBinaryA@28'
[Error] ld returned 1 exit status

¿Qué está suciendiendo?

BloodSharp

Cita de: MeTaD en 30 Marzo 2013, 02:24 AM
Gracias por tu pronta respuesta amigo, pero surge el siguiente problema:

Si no cambio lstrLenW(szKey) por lstrlenA(szKey) da el siguiente error:
Citar[Error] cannot convert 'CHAR* {aka char*}' to 'LPCWSTR {aka const wchar_t*}' for argument '1' to 'int lstrlenW(LPCWSTR)'

Es porque estás tratando de usar una cadena ansi en una función que recibe una cadena unicode...

http://msdn.microsoft.com/en-us/library/windows/desktop/ff381407(v=vs.85).aspx

Cita de: MeTaD en 30 Marzo 2013, 02:24 AMLuego de realizar el cambio da el siguiente error:

Citarundefined reference to `_imp__CryptStringToBinaryA@28'
[Error] ld returned 1 exit status

¿Qué está suciendiendo?

El compilador no tiene la referencia de que modulo debe importar esa función (Tenés que agregar la librería estática de la dll Crypt32.dll)


B#



MeTaD

Cita de: IEAX en 30 Marzo 2013, 02:43 AM


Es porque estás tratando de usar una cadena ansi en una función que recibe una cadena unicode...

http://msdn.microsoft.com/en-us/library/windows/desktop/ff381407(v=vs.85).aspx

¿Qué está suciendiendo?

El compilador no tiene la referencia de que modulo debe importar esa función (Tenés que agregar la librería estática de la dll Crypt32.dll)


B#

No entiendo, si la tiene:
Citar#pragma comment (lib, "Crypt32.lib")
¿Es eso?

¿Cómo soluciono lo primero?, de verdad que estoy muy básico pero me encantaría poder solucionar este obstáculo... porfavor.

BloodSharp

Cita de: MeTaD en 30 Marzo 2013, 02:46 AM
#pragma comment (lib,"Crypt32.lib")

Si era eso, pero al parecer tu librería estática no contiene la definición de esa función... lo cual es raro :S

Cita de: MeTaD en 30 Marzo 2013, 02:46 AM
¿Cómo soluciono lo primero?, de verdad que estoy muy básico pero me encantaría poder solucionar este obstáculo... porfavor.

Te dejo el link de como lo hice yo para que no te hagas más líos :S

https://rapidshare.com/files/2056454809/CryptStringBinary.rar


B#



MeTaD

Cita de: IEAX en 30 Marzo 2013, 03:02 AM
Si era eso, pero al parecer tu librería estática no contiene la definición de esa función... lo cual es raro :S

Te dejo el link de como lo hice yo para que no te hagas más líos :S

https://rapidshare.com/files/2056454809/CryptStringBinary.rar


B#


Gracias por tu disposición amigo, al intentar descargar dice
CitarDownload permission denied by uploader. (0b67c2f5)
jajajaja hoy no es mi día jajajaja

BloodSharp

#7
probá de nuevo ya lo solucioné :P

PD: No sé si está bien implementado pero compila eso seguro...


B#



MeTaD

Amigo, una última pregunta antes de revisar tu archivo... ¿Cómo haces para programar en Visual Studio sin crear dependencia a .net framwork?

BloodSharp

Cita de: MeTaD en 30 Marzo 2013, 03:08 AM
Amigo, una última pregunta antes de revisar tu archivo... ¿Cómo haces para programar en Visual Studio sin crear dependencia a .net framwork?

No sé a que te referís, supuestamente si creas un proyecto de aplicación Win32 no tiene porque agregarte dependencia a .net framework... (eso creo)


B#