Page 1 of 1
Utilizar funciones de una dll con harbour
Posted: Thu Dec 06, 2018 12:02 pm
by Xevi
Si bien he probado y visto como se saca partido a unas funciones de una dll con FW, del sample babu.prg y babudll.prg
Pretendo utilizar lo mismo, funciones de un fichero dll, el mismo babudll.dll, PERO sin utilizar FW, con Harbour nativo.
He agregado la lib hbxpp para compilar, pero no consigo hacerlo andar.
También, segun he visto algun ejemplo por la red, pero no lo consigo!!!
Code: Select all
function Main()
Local hDLL
hDLL = LoadLibrary( "user32.dll" )
msginfo( hDLL ) //me da correctamente el handle
//hbxpp.lib
//DllCall(<cDllFile>|<nDllHandle>,[<nCallingConvention>],<cFuncName>|<nOrdinal>,[<xParams,...>])->nResult
DllCall( "user32.dll", 32, "GetWindowText" )
DllCall( hDLL, 32, "GetWindowText" )
//no consigo nada, ni con el nombre ni con el handle
MsgInfo( "aquí llego" )
FreeLibrary( hDLL )
return nil
¿Alguien puede orientarme un poco???
¿Que hago mal???
¿Que me falta???
¿Se pueden atacar DLLs con harbour nativo???
Gracias.
Re: Utilizar funciones de una dll con harbour
Posted: Thu Dec 06, 2018 10:14 pm
by cmsoft
Esto es con la funcion CALLDLL32 de Fivewin, no se si te servira.
Code: Select all
nHandler := CallDll32( "Funcion" , "ARCHIVO.DLL" , nParam1 , nParam2 )
IF nHandler >= 0
CallDll32( "OtraFuncion" , "ARCHIVO.DLL" , nHandler )
CallDll32 ( "Respuesta" , "ARCHIVO.DLL" , nHandler, @RTA )
ENDIF
Re: Utilizar funciones de una dll con harbour
Posted: Thu Dec 06, 2018 11:05 pm
by cnavarro
Mira este ejemplo
Code: Select all
#include "Fivewin.ch"
Static cTitle := ""
Function Main()
local oDlg
cTitle := Space( 40 )
DEFINE WINDOW oDlg TITLE "Prueba" FROM 10, 10 TO 200, 300 PIXEL
ACTIVATE WINDOW oDlg ON INIT ( GetTextW( oDlg:hWnd, @cTitle, 255 ), MsgInfo( cTitle ) )
Return nil
DLL FUNCTION GetTextW( nHandle AS LONG, @cT AS LPSTR, nMax AS LONG ) AS _INT PASCAL FROM "GetWindowTextA" LIB "user32.dll"
Re: Utilizar funciones de una dll con harbour
Posted: Mon Dec 10, 2018 8:41 am
by Xevi
Las dos opciones requieren de FW, por lo tanto no me sirve para utilizar con Harbour nativo.
Cristobal, el código ppo de la opcion que me sugieres, hecha mano de FWCallDLL y GetProcAdd de FW
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 = FWCallDLL( 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
Y la otra opción, CallDll32, ya directamente es una función de FW.
Alguna sugerencia... o cual foro Harbour donde poner mi petición???
Gracias.
Re: Utilizar funciones de una dll con harbour
Posted: Mon Dec 10, 2018 2:49 pm
by Joaquim Ferrer
Buenas Xevi
Pretendes utilizar funciones contenidas en una DLL o pcode harbour de una DLL ?
Si es lo último :
Code: Select all
DYNAMIC HRBFUNC1
FUNCTION Main()
Local x, handle := hb_LibLoad( "my.dll" )
x := hrbFunc1() // hrbFunc1 - the function from my.dll
hb_LibUnload( handle )
Return Nil
Tienes +info en
http://www.kresin.ru/en/hrbfaq_3.html#Doc12
Re: Utilizar funciones de una dll con harbour
Posted: Mon Dec 10, 2018 4:33 pm
by Xevi
Gracias, Quim.
Funciones contenidas en una Dll...
Llamar a funciones en pcode, eso ya lo havia visto.
Re: Utilizar funciones de una dll con harbour
Posted: Tue Dec 11, 2018 7:42 am
by Joaquim Ferrer
Xevi
Puedes probar con automatización OLE y la función harbour
Tienes un ejemplo en
https://github.com/vszakats/harbour-cor ... ts/ole.prg
También puedes llamar a una DLL de esta forma, mediante un script, linea de comando, etc
Code: Select all
Rundll32 Shell32.dll,SHHelpShortcuts_RunDLL PrintersFolder
Algunos ejemplos en
https://www.thewindowsclub.com/rundll32 ... ds-windows
Saludos