xHarbour Reference Documentation > Function Reference |
Executes a function located in a dynamically loaded xHarbour DLL.
HB_LibDo( <cFuncName> [, <xParams,...>] ) --> xResult
The function returns the result of the called DLL function.
Function HB_LibDo() is used to execute functions located in DLL files created by the xHarbour compiler and linker. This applies to DLL files loaded dynamically at runtime with function LibLoad(). If a DLL file is bound statically at link time, a DLL function can be called directly.
HB_LibDo() looks up the symbolic function name <cFuncName> and passes the values of <xParams,...> to it. The return value of HB_LibDo() is the result of <cFundName>. If <cFuncNmae> cannot be found, a runtime error is generated.
Important: the EXE file loading the xHarbour DLL with LibLoad() must be created for DLL usage for HB_LibDo() to work properly (compiler switch -usedll, linker switch /DLL).
See also: | DllCall(), LibLoad(), LoadLibrary() |
Category: | DLL functions , xHarbour extensions |
Source: | vm\dynlibhb.c |
LIB: | xhb.lib |
DLL: | xhbdll.dll |
// The example consists of two file. The first is compiled to an EXE // and the second to a DLL. Function SayHello() resides in the DLL // and is called from the EXE. /* ------------------------------------------------------------ // File: DYNDLL.PRG // Compile and link as EXE for DLL usage // e.g. XBuild -usedll dyndll.exe dyndll.prg // ---------------------------------------------------------- */ PROCEDURE Main LOCAL pDLL ? Type( "SayHello()" ) // result is "U" because the function SayHello() // does not exist ? pDLL := LibLoad( "dyndll1.dll" ) // result is a pointer to the loaded DLL ? Type( "SayHello()" ) // result is "UI" because function SayHello() // exists now (in loaded DLL) ? HB_LibDo( "SayHello" ) // result is: 1 // displays : Hello from DLL ? HB_LibDo( "SayHello", "Called via HB_LibDo()" ) // result is: 2 // displays : Called via HB_LibDo() ? &("SayHello")( "Called via Macro operator" ) // result is: 3 // displays : Called via Macro operator // // NOTE: // This is the fastest way of calling a DLL function: // // The macro operator "&" looks up the function symbol. // The execution operator "()" calls the function and // passes parameter(s) on to it ? LibFree( pDll ) // result is .T., DLL is successfully unloaded ? Type( "SayHello()" ) // result is "U" because the function SayHello() // does not exist anymore RETURN /* ------------------------------------------------------------ // File: DYNDLL1.PRG // Compile and link as DLL // e.g. XBuild dyndll1.dll dyndll.prg // ---------------------------------------------------------- */ FUNCTION SayHello( cText ) STATIC nCalls := 0 IF cText == NIL cText := "Hello from DLL" ENDIF ? cText RETURN ++nCalls
http://www.xHarbour.com