Basicamente lo que se hace es inicializar la máquina virtual de Harbour desde el punto de entrada de la DLL. Es lo que hemos hecho por ejemplo para usar Harbour en iOS (iPhone/iPad) y en Android (FivePhone):
- Code: Select all Expand view
hb_vmInit( TRUE );
Una vez la máquina virtual de Harbour está inicalizada, se trata de acceder a una función exportada que prepare la pila de Harbour de forma correcta y ejecute la función de Harbour solicitada. Hay ejemplos de ese código aqui:
viewtopic.php?p=66195#p66195En concreto:
- Code: Select all Expand view
#pragma BEGINDUMP
#include <hbapi.h>
#include <hbvm.h>
...
// We build the virtual machine stack frame
hb_vmPushSymbol( hb_dynsymGetSymbol( "SAY" ) ); // we push the symbol of the method
hb_vmPush( hb_param( 1, HB_IT_OBJECT ) ); // we push the object or just NIL for a function/procedure call
hb_vmPushString( "Calling a method from low level", strlen( "Calling a method from low level" ) );
hb_vmFunction( 1 ); // 1 --> number of supplied parameters
// the returned value can be accessed using hb_stackReturnItem() --> PHB_ITEM
// or simply calling hb_par...( -1 );
}
#pragma ENDDUMP
Ese código debe ser exportado para que pueda accederse desde aplicaciones que usen la DLL. Harbour proporciona un define para que exportar una función en lenguaje C: HB_EXPORT.
El primer paso para practicar esto es aprender a construir una DLL simple en puro lenguaje C y probar a acceder a ella, por ejemplo desde el mismo Harbour. FiveWin proporciona un ejemplo sencillo en FWH\dlls\screen32.c y rc2dll32.bat. Para implementar alguna función tenemos más ejemplos en: