Página 1 de 1

CFDLib.dll y Xharbour

Publicado: Mar Ene 24, 2012 5:58 pm
por interwin
Hola

Estoy empezando a hacer pruebas con esta libreria y xHarbour+FiveWin, ya pude generar una factura electronica usando:

DLL32 FUNCTION GeneraCFD(cArchivoIni AS LPSTR, cPass AS LPSTR) AS BOOL PASCAL FROM "GeneraCFD" LIB "CFDLib.dll"
DLL32 FUNCTION GetError() AS STRING PASCAL FROM "GetError" LIB "CFDLib.dll"
DLL32 FUNCTION GetErrorExt() AS STRING PASCAL FROM "GetErrorExt" LIB "CFDLib.dll"

y llamando a la funciones para crear el CFD:

GeneraCFD(cDirectorioPrograma+'\Tempo.ini', allTrim(Certs->PassKey) )
MSGINFO(GetError())
MSGINFO(GetErrorExt())

Cuando el archivo de entrada es correcto, se genera el XML bien.
Cuando el archivo de entrada es incorrecto, no se genera el XML pero GETERROR Y GETERROREXT regresan una cadena vacia en lugar de dar el detalle de los errores

Si estas usando esta libreria con xHarbour y FiveWin, ¿como la impementaste?

De antemano muchas gracias

Jose Rios

Re: CFDLib.dll y Xharbour

Publicado: Mar Ene 24, 2012 7:36 pm
por Dado
Todos los ejemplos que incluyo en la libreria han sido proporcionados por usuarios como tu que amablemente me han enviado su codigo.

Yo no programo en XHarbour e igual voy a decir puras mensadas pero dentro de la libreria NO USO CADENAS ESTANDAR DE PASCAL, uso CADENAS ESTANDAR DE LENGUAJE "C"

Asi pues, intenta quitar la directiva "Pascal" para ver si con eso puedes obtener el resultado.

Tambien puedes intentar hacer una llamada a CFDLibVersion esa funcion SIEMPRE regresa un string con la version, de esa forma puedes probar como leer una cadena de mis rutinas

Precisamente haciendo incapie a que los ejemplos me los han pasado te aconsejaria que BUSQUES aqui en el foro "XHarbour" o "fivewin" hay ejemplos e informacion que talvez puedan ayudarte.

pd. movi tu tema aqui a "soporte libreria cfdlib.dll" que es donde deberia estar. saludos.

Re: CFDLib.dll y Xharbour

Publicado: Mié Ene 25, 2012 12:04 am
por interwin
Dado.

Muchas gracias por responder. Ya pude hacer que funcionara la lib con xharbour y fivewin haciendo lo siguiente:

Código: Seleccionar todo

static hLibCFD
function main ()
         .
         .
         .
          AbreDLL()

          GeneraCFD(cDirectorioPrograma+'\Tempo.ini', allTrim(Certs->PassKey) )
          if allTrim(GetError())=''
                   MSGINFO(GetError())
                   MSGINFO(GetErrorExt())
           endIf
         .
         .
         .
return NIL

Static Function AbreDLL()
   LOCAL lRet:=.F.
   LOCAL cDllName:="CFDLib.dll"

   hLibCFD:=LoadLibrary(cDllName)
   if Abs( hLibCFD ) <= 32
      MsgAlert( "Error code: " + LTrim( Str( hLibCFD ) ) + " loading " + cDllName )
      lRet:=.F.
   else
      lRet:=.T.
   endif
Return lRet

DLL32 FUNCTION GeneraCFD(cArchivoIni AS LPSTR, cPass AS LPSTR) AS BOOL PASCAL FROM "GeneraCFD" LIB hLibCFD
DLL32 FUNCTION GetError() AS LPSTR PASCAL FROM "GetError" LIB hLibCFD
DLL32 FUNCTION GetErrorExt() AS LPSTR PASCAL FROM "GetErrorExt" LIB hLibCFD
DLL32 FUNCTION CadenaOriginal() AS LPSTR PASCAL FROM "CadenaOriginal" LIB hLibCFD
DLL32 FUNCTION SelloDigital() AS LPSTR PASCAL FROM "SelloDigital" LIB hLibCFD
DLL32 FUNCTION CFDLibVersion() AS STRING PASCAL FROM "CFDLibVersion" LIB hLibCFD
DLL32 FUNCTION PruebaSimple() AS LPSTR FROM "PruebaSimple" LIB hLibCFD
DLL32 FUNCTION PruebaClaveDeLlavePrivada(cKey AS LPSTR, cClave AS LPSTR) AS BOOL PASCAL FROM "PruebaClaveDeLlavePrivada" LIB hLibCFD
DLL32 FUNCTION TimbrarCFD(cArchivoIni AS LPSTR) AS LPSTR PASCAL FROM "TimbrarCFD" LIB hLibCFD

Con esta implementacion ya puedo generar el cfd y visualizar la cadena con la informacion de los errores obtenidos con GetError y GetErrorExt, lo unico que no me funciona es al visualizar el valor regresado por por las funciones GeneraCFD y PruebaClaveDeLlavePrivada que regresan un valor tipo boolean, en estos casos siempre obtengo true aunque se se haya producido un error.

Tambien segui tu recomendacion de intentar en modo c en lugar de modo pascal pero la verdad casi de lenguaje C no se nada, lo intente de la siguiente forma dentro de mi programa en xharbour y fivewin:

Código: Seleccionar todo


function main()
    .
    .
    hLib := LOADL( "CFDLib.dll" )
    GENERACFD(hLib,cDirectorioPrograma+'\Tempo.ini',allTrim(Certs->PassKey))
    .
    .
return NIL


#pragma BEGINDUMP

#include <hbapi.h>
#include <windows.h>

HB_FUNC( LOADL )
{
  hb_retnl( (long)LoadLibrary( hb_parc( 1 ) ) );
}

HB_FUNC(GENERACFD)
{
    typedef long   ( __cdecl * __GeneraCFD )( char * szArchivoIni, char * szPasKey);
    __GeneraCFD GeneraCFD = (__GeneraCFD)GetProcAddress( (HMODULE)hb_parnl( 1 ), "GeneraCFD" );
    hb_retnl( GeneraCFD( hb_parc( 2 ), hb_parc( 3 ) ));
}

#pragma ENDDUMP
Pero algo estoy haciendo mal porque el programa se bloquea al llamar la funcion generacfd.

Saludos.

Jose Rios.

Re: CFDLib.dll y Xharbour

Publicado: Mié Ene 25, 2012 8:39 am
por Dado
No programo en XHarbour pero me parece que esto no tiene logica

Código: Seleccionar todo

if allTrim(GetError())=''
                   MSGINFO(GetError())
                   MSGINFO(GetErrorExt())
           endIf
yo lo interpreto como :

Si GetError es igual a NADA entonces muestra un mensaje de GetError (NADA!!!)

Deberia ser mas o menos asi :

if GeneraCFD(cDirectorioPrograma+'\Tempo.ini', allTrim(Certs->PassKey) ) = 0
_____El timbrado fue exitoso

else
_______hubo un error, el error esta en GetError()

Checa que tienes que revisar LO QUE DEVUELVE GeneraCFD y si es un cero significa que todo esta bien, si no es cero entonces hubo un error