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

Code: Select all

win_oleCreateObject()
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