[VB6] [Ayuda con Invoke] en CryptAPI

Iniciado por STARZ, 20 Junio 2012, 23:14 PM

0 Miembros y 1 Visitante están viendo este tema.

STARZ

Hola, estoy queriendo resumir y usar Invoke o CAbN (Call Api by Name) en el siguiente algoritmo de encriptacion basicamente porque es bastante rapido.

http://pastebin.com/R9eXK9gX

No tuve ningun problema en pasar todas funciones, pero me he trabado en esta parte (CryptDecrypt y CryptEncrypt)

Código (vb) [Seleccionar]

Private Declare Function CryptEncrypt Lib "advapi32.dll" (ByVal hKey As Long, ByVal hHash As Long, ByVal Final As Long, ByVal dwFlags As Long, ByVal pbData As String, ByRef pdwDataLen As Long, ByVal dwBufLen As Long) As Long
Private Declare Function CryptDecrypt Lib "advapi32.dll" (ByVal hKey As Long, ByVal hHash As Long, ByVal Final As Long, ByVal dwFlags As Long, ByVal pbData As String, ByRef pdwDataLen As Long) As Long


Código (vb) [Seleccionar]
 
 'Encrypt or decrypt depending on the Encrypt parameter
 lLength = Len(Text)
 If (Encrypt) Then
  If (CryptEncrypt(hKey, 0, 1, 0, Text, lLength, lLength) = 0) Then '<--- DUDA! No se como pasarlo a CAbN
     Call Err.Raise(vbObjectError, , "Error during CryptEncrypt.")
   End If
 Else
   If (CryptDecrypt(hKey, 0, 1, 0, Text, lLength) = 0) Then '<--- DUDA!
     Call Err.Raise(vbObjectError, , "Error during CryptDecrypt.")
   End If
 End If
 


Agradeceria que alguien me explique como hacer para usar el CAbN en esos dos casos.
Supongo que voy a poner el codigo final (con todas las funciones pasadas a CAbN) cuando resuelva esta parte.

raul338


STARZ

Gracias por responder, pero ese no es el problema, se como usar Invoke o Call Api by Name.
Mi problema es que no se por qué no puedo hacer andar esas dos APIS con Invoke:

CryptEncrypt y CryptDecrypt , ambas de "advapi32.dll"

¿Alguien sabe como invokar esas dos funciones para que funcione en el código que puse ahi arriba en el PasteBin?

raul338

#3
Pero es que no hay "un solo CallApiByName", cuál estas usando vos?

Aunque todos por lo general aceptan punteros o valores enteros como parametros. Asi que si tenes que pasar algo que no sea de tipo numero entero. Hacelo con VarPtr, ObjPtr o StrPtr segun corresponda. Cuando uses StrPtr, recuerda que este te devuelve un puntero a un string Unicode, así que la llamada debe ser a la version Unicode de la función o sino transformar el string a Array y de ahí pasarlo con VarPtr(miString(0))

Proba con el de Paul Caton que es muy probable que te funcione, despues vas comentando

STARZ

#4
Wow!, por un segundo pensé que me había equivocado de Foro...
Gracias por responder @raul338 estoy probando lo que me decís.

Edit: Dejo el Code completo solo por si alguien quiere terminarlo así lo comparte
Están las líneas originales y los comments:
http://pastebin.com/rNg0v5hN
Serían esas dos líneas que marqué en mi comentario anterior lo que fataría invokar.

Uso este Invoke:
http://cobein.com/wp/?p=567