La Web del Programador: Comunidad de Programadores
 
    Pregunta:  62280 - LLAMADAS A FUNCIONES DENTRO DE UNA DLL
Autor:  Juan Antonio Macareno Palacios
Para los expertos en visual, aqui expongo mi problema, espero me orienten en los errores
que esto cometiendo, gracias.

Me mandaron una libreria (sgenc32.dll) y junto con ella me mandaron el codigo para accesar
via Visual Basic que es el siguiente:

' Definiciones VB
' Estructura anterior
Public Type registro_CURP
curp As String * 19
archivokey As String * 256
password As String * 256
End Type

' Estructura actual (Generica)
Public Type registro_CURPG
curp As String * 19
archivokey As String * 256
archivocer As String * 256
password As String * 256
End Type

' Funciones anteriores
Declare Function BuscaCurps Lib "sgenc32" Alias "_BuscaCurps@8" (ByVal strArchOrig As String, ByRef CURPS() As registro_CURP) As Long
Declare Function GeneraFirmaDigital Lib "sgenc32" Alias "_GeneraFirmaDigital@8" (ByVal strArchOrig As String, ByRef CURPS() As registro_CURP) As Long

' Funciones actuales (Genericas)
Declare Function BuscaCurpsG Lib "sgenc32" Alias "_BuscaCurpsG@12" (ByVal strArchOrig As String, ByVal tipo As Long, ByRef CURPS() As registro_CURPG) As Long
Declare Function GeneraFirmaDigitalG Lib "sgenc32" Alias "_GeneraFirmaDigitalG@12" (ByVal strArchOrig As String, ByVal tipo As Long, ByRef CURPS() As registro_CURPG) As Long

Nuevos Códigos de Error:

10 = Tipo de documento a firmar no valido
11 = No se pudo leer el certificado
12 = Certificado caduco.
13 = El archivo contiene más de un registro 201.

Donde tipo = Tipo de documento a firmar

0 (cero) = PEDIMENTOS
1 = ENCARGOS
2 = AVISOs DE TRANSFERENCIA

Genero una estructura llamada MCURPG de la siguiente manera:

Public MCURPG(0 To 9) As registro_CURPG

luego, cuando hago la llamada a la libreria escribo el siguiente codigo para recibir un resultado de respuesta o de "estado" sobre la llamada (status).

status = BuscaCurpsG(ByVal mstrArchOrig, ByVal mtipo, MCURPG)

Donde status me regresa un 0 y esto se refiere a que hubo exito en la llamada de la libreria, para esto compruebo con un print si en la estructura viene el dato de la cupr
en esta forma:

Print status, MCURPG(0).curp

y la estructura MCURPG(0).curp si trajo un dato o recibio un dato de la libreria sgenc32.dll, Hasta aqui todo esta correcto, el siguiente paso es volver a accesar a la libreria y enviar los siguientes datos:

MCURPG(0).archivocer = "c: mpdavs.cer"
MCURPG(0).archivokey = "C:TMPDAVS.key"
MCURPG(0).password = "davsh02"

firmadig = GeneraFirmaDigitalG(ByVal mstrArchOrig, ByVal mtipo, MCURPG)

Aqui es donde comienza el problema, porque firmadig es la variable que recibo con el estado de la llamada a la libreria, y siempre me manda el codigo 11 (no se pudo leer el certificado).

Por lo que yo pienso que no estoy enviando bien la estructura a la libreria con la informacion que requiere para generar la firma digital.

Espero poderme explicar cual es mi situacion y gracias por sus prontas respuestas.

Saludos.

  Respuesta:  FTanori .
Para utilizar las funciones "G" la estructura "G" debes indicar el Certificado

MCURPG(0).archivocer = "c: mpdavs.cer"
MCURPG(0).archivokey = "C:TMPDAVS.key"
MCURPG(0).archivocer = "C:TMPDAVS.cer" ' <=== Incluir Certificado
MCURPG(0).password = "davsh02"
==============================================================

  Respuesta:  Juan Antonio Macareno Palacios.
Al fin, problema solucionado, genere un programa externo para que sea llamado desde visual fox con parametros, esto es...

nombredelprograma.exe "parametroarchivo|parametrocertificado|parametroarchivokey|parametroclave"

y listo, ya esta en funcionamiento.

Saludos