Page 1 of 1

dll... cómo la utilizo en Xailer o Harbour ???

Posted: Thu Dec 06, 2018 9:59 am
by XeviCOMAS
Bien, dada un dichero .dll básico, con un par de funciones, pues no se como utilizarla y sacarle el rendimiento en mi aplicación Xailer.

Si bien he buscado, leido, igual no he llegado hasta donde...

hDLL := LoadLibrary( "midll.dll" )
MsgInfo( hDLL ) //hasta ahí llego y me da el handle
FreeLibrary( hDLL ) //libero el handle


ahora bien, entre LoadLibrary() y FreeLibrary()
¿como abro una función contenida en esa dll ???

Buscando y leyendo un poco, he visto que añadiendo la lib hbxpp contiene la función CallDLL(), pero no me está funcionando.

Alguna función xaCallDLL( hDLL, "funciondll" ), no se, pregunto.

Alguna ayudita???

Re: dll... cómo la utilizo en Xailer o Harbour ???

Posted: Thu Dec 06, 2018 8:43 pm
by ignacio
Buenos días,

En principio, en cuanto la DLL está cargada todas sus funciones están en ámbito. Es decir, no hay que hacer nada. Ahora bien, tienes que decirle a tu aplicación que va a llamar a una función que sólo va estar accesible cuando se cargue la DLL. Para ello has de utilizar la instrucción DYNAMIC cuyo uso se parece mucho en uso a la instrucción REQUEST.

Un saludo

Re: dll... cómo la utilizo en Xailer o Harbour ???

Posted: Thu Dec 06, 2018 9:04 pm
by XeviCOMAS
Ignacio,

gracias por tu pronta respuesta.
Entendido!!!

Con el Sample DllTest funciona correctamente.

Ahora bien, si la dll es externa, de un tercero, escrita en Harbour... deberia de funcionar igual, no???

Es que tengo problemas, igual por distinta versión de Harbour ???

Re: dll... cómo la utilizo en Xailer o Harbour ???

Posted: Sun Dec 09, 2018 12:57 pm
by jfgimenez
Xevi,

si la DLL no está escrita en Harbour, entonces no te va a funcionar. Y si está escrita en Harbour, entonces te aconsejo que quien la haya creado la compile con Xailer.

En Harbour hay distintas formas de crear una DLL (con la HVM incluida, usando la HVM del .exe, usando la HVM de una harbour.dll, ...) y cada una se utiliza de distinta forma. Por otro lado, para usar una DLL de Harbour desde un programa Harbour, debería coincidir la versión de Harbour o al menos que tenga la misma versión de pcode. Puede incluso que haya otros requisitos.

Por si te interesa saberlo, Xailer crea DLLs muy ligeras, y utiliza la HVM que esté incluida en el .exe

Re: dll... cómo la utilizo en Xailer o Harbour ???

Posted: Mon Dec 10, 2018 10:30 am
by XeviCOMAS
Pero...

Si, he visto que Xailer las crea ligeras... no, lo siguiente.
Està muy bien para compartir entre "nosotros", PERO...
Es incomprensible, ya no digo Xailer... que Harbour no pueda utilizar DLLs de terceros. Por ejemplo "User32.dll" u otra cualquiera que sea completa, con codigo autocontenido.

No se, en fin, sigo guscando la opción de poder utilizarlas...
Si alguien, que seguro que a alguien más le pasa por la cabeza de utilizar DLLs de terceros, puede o tiene código para compartir.

¿Algun foro directo de Harbour para abrir hilo ???


En alguna otra herramienta las utilizan de esta forma...
GetTextW( nHandle, @cTitle, 255 )
...
DLL FUNCTION GetTextW( nHandle AS LONG, @cT AS LPSTR, nMax AS LONG ) AS _INT PASCAL FROM "GetWindowTextA" LIB "user32.dll"

Pero, claro, desmenuzando/viendo el codigo que genera DLL FUNCTION, utiliza un par de funciones propias de su lenguaje que no tengo ni idea...
xxxCallDLL() y GetProcAdd()

function GetTextW( nHandle,cT,nMax )
local _hDLL := If( ValType( "user32.dll" ) == "N", "user32.dll", LoadLibrary( "user32.dll" ) )
local uResult
local cFarProc

if Abs( _hDLL ) > 32
cFarProc = GetProcAdd( _hDLL, If( Empty( "GetWindowTextA" ) == .T., "GetTextW", "GetWindowTextA" ), .T., 7,7,9,7 )
uResult = xxxCallDLL( cFarProc,nHandle,@cT,nMax )
If( ValType( "user32.dll" ) == "N",, FreeLibrary( _hDLL ) )
else
MsgAlert( "Error code: " + LTrim( Str( _hDLL ) ) + " loading " + If( ValType( "user32.dll" ) == "C", "user32.dll", Str( "user32.dll" ) ) )
end

return uResult


Gracias por vuestro tiempo.