diff --git a/harbour/ChangeLog b/harbour/ChangeLog index b8723e9b3c..0866223cfa 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,6 +16,15 @@ The license applies to all entries newer than 2009-04-28. */ +2011-05-17 22:26 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) + * contrib/xhb/xhb.hbc + * contrib/xhb/xhb.hbp + + added hbxpp as a dependency for xhb. for dll handling. + + + contrib/xhb/hbdll.ch + + added header from xhb project, with some basic adaptation. + fully untested. + 2011-05-17 21:57 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) * config/global.mk ! fixed mingw64 detection regression breaking official mingw64 build on win diff --git a/harbour/contrib/xhb/hbdll.ch b/harbour/contrib/xhb/hbdll.ch new file mode 100644 index 0000000000..4e5a2f4a17 --- /dev/null +++ b/harbour/contrib/xhb/hbdll.ch @@ -0,0 +1,184 @@ +/* + * $Id$ + */ + +/* + * Harbour Project source code: + * + * + * www - http://harbour-project.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/). + * + * As a special exception, the Harbour Project gives permission for + * additional uses of the text contained in its release of Harbour. + * + * The exception is that, if you link the Harbour libraries with other + * files to produce an executable, this does not by itself cause the + * resulting executable to be covered by the GNU General Public License. + * Your use of that executable is in no way restricted on account of + * linking the Harbour library code into it. + * + * This exception does not however invalidate any other reasons why + * the executable file might be covered by the GNU General Public License. + * + * This exception applies only to the code released by the Harbour + * Project under the name Harbour. If you copy code from other + * Harbour Project or Free Software Foundation releases into a copy of + * Harbour, as the General Public License permits, the exception does + * not apply to the code that you add in this way. To avoid misleading + * anyone as to the status of such modified files, you must delete + * this exception notice from them. + * + * If you write modifications of your own for Harbour, it is your choice + * whether to permit this exception to apply to your modifications. + * If you do not wish that, delete this exception notice. + * + */ + +#include "dll.ch" + +#ifndef __DLL_CH + #define __DLL_CH + + #define DC_MICROSOFT 0x0000 // Default + #define DC_BORLAND 0x0001 // Borland compat + #define DC_CALL_CDECL DLL_CDECL + #define DC_CALL_STD DLL_STDCALL + #define DC_RETVAL_MATH4 0x0100 // Return value in ST + #define DC_RETVAL_MATH8 0x0200 // Return value in ST + + // Avoid xHarbour code when included by dllcall.c + #if defined( __PLATFORM__WINDOWS ) + + #include "cstruct.ch" + #include "wintypes.ch" + + // Native Syntax + #xcommand IMPORT [] [ ] ; + ( [ [, ] ] ) FROM [ OF ] <(DllName)> => ; + UTILITY [] FUNCTION ( [, ] );; + STATIC cTemplate;; + ;; + IF cTemplate == NIL;; + cTemplate := DllPrepareCall( <(DllName)>, IIF( <.CallConvention.>, , DC_CALL_STD ), IIF( <.DllFuncName.>, #, # ) );; + ENDIF;; + ;; + IF <.ArgName.>;; + RETURN DllExecuteCall( cTemplate, [, ] );; + ENDIF;; + RETURN DllExecuteCall( cTemplate ) + + #xcommand IMPORT [] [ ] ; + ( [ [, ] ] ) FROM <(DllName)> [EXPORTED AS ] => ; + UTILITY [] FUNCTION ( [, ] );; + STATIC cTemplate;; + ;; + IF cTemplate == NIL;; + cTemplate := DllPrepareCall( <(DllName)>, IIF( <.CallConvention.>, , DC_CALL_STD ), IIF( <.DllFuncName.>, #, # ) );; + ENDIF;; + ;; + IF <.ArgName.>;; + RETURN DllExecuteCall( cTemplate, [, ] );; + ENDIF;; + RETURN DllExecuteCall( cTemplate ) + + + #xcommand IMPORT [] [ ] ; + ( [0] [ [, ] ] ) FROM <(DllName)> [EXPORTED AS ] => ; + UTILITY [] FUNCTION ( [, ] );; + STATIC cTemplate;; + ;; + IF cTemplate == NIL;; + cTemplate := DllPrepareCall( <(DllName)>, IIF( <.CallConvention.>, , DC_CALL_STD ), IIF( <.DllFuncName.>, #, # ) );; + ENDIF;; + ;; + IF <.ArgName.>;; + RETURN DllExecuteCall( cTemplate, [, ] );; + ENDIF;; + RETURN DllExecuteCall( cTemplate ) + + #xcommand IMPORT [] [ ] ; + ( [0] [ [, ] ] ) FROM [ OF ] <(DllName)> => ; + UTILITY [] FUNCTION ( [, ] );; + STATIC cTemplate;; + ;; + IF cTemplate == NIL;; + cTemplate := DllPrepareCall( <(DllName)>, IIF( <.CallConvention.>, , DC_CALL_STD ), IIF( <.DllFuncName.>, #, # ) );; + ENDIF;; + ;; + IF <.ArgName.>;; + RETURN DllExecuteCall( cTemplate, [, ] );; + ENDIF;; + RETURN DllExecuteCall( cTemplate ) + + // FoxPro Syntax + #xcommand DECLARE IN <(DllName)> [AS <(DllFuncName)>] [ [@] [] [, [@] []]] => ; + UTILITY FUNCTION ( ... );; + STATIC cTemplate;; + ;; + IF cTemplate == NIL;; + cTemplate := DllPrepareCall( <(DllName)>, DC_CALL_STD, IIF( <.DllFuncName.>, <(DllFuncName)>, # ) );; + ENDIF;; + ;; + SWITCH PCount();; + CASE 0;; + RETURN DllExecuteCall( cTemplate );; + CASE 1;; + RETURN DllExecuteCall( cTemplate, PValue(1) );; + CASE 2;; + RETURN DllExecuteCall( cTemplate, PValue(1), PValue(2) );; + CASE 3;; + RETURN DllExecuteCall( cTemplate, PValue(1), PValue(2), PValue(3) );; + CASE 4;; + RETURN DllExecuteCall( cTemplate, PValue(1), PValue(2), PValue(3), PValue(4) );; + CASE 5;; + RETURN DllExecuteCall( cTemplate, PValue(1), PValue(2), PValue(3), PValue(4), PValue(5) );; + CASE 6;; + RETURN DllExecuteCall( cTemplate, PValue(1), PValue(2), PValue(3), PValue(4), PValue(5), PValue(6) );; + CASE 7;; + RETURN DllExecuteCall( cTemplate, PValue(1), PValue(2), PValue(3), PValue(4), PValue(5), PValue(6), PValue(7) );; + CASE 8;; + RETURN DllExecuteCall( cTemplate, PValue(1), PValue(2), PValue(3), PValue(4), PValue(5), PValue(6), PValue(7), PValue(8) );; + CASE 9;; + RETURN DllExecuteCall( cTemplate, PValue(1), PValue(2), PValue(3), PValue(4), PValue(5), PValue(6), PValue(7), PValue(8), PValue(9) );; + END;; + ;; + RETURN NIL + + // FWH + #xcommand DLL [] FUNCTION ( [ AS ] [, AS ] ) AS [] [ FROM ] LIB <(DllName)> => ; + UTILITY [] FUNCTION ( [, ] );; + STATIC cTemplate;; + ;; + IF cTemplate == NIL;; + cTemplate := DllPrepareCall( <(DllName)>, IIF( <.Pascal.>, DC_CALL_STD, DC_CALL_CDECL ), IIF( <.DllFuncName.>, <(DllFuncName)>, # ) );; + ENDIF;; + ;; + RETURN DllExecuteCall( cTemplate [, ] [, ] ) + + #xcommand DLL32 [] FUNCTION ( [ AS ] [, AS ] ) AS [] [ FROM ] LIB <(DllName)> => ; + UTILITY [] FUNCTION ( [, ] );; + STATIC cTemplate;; + ;; + IF cTemplate == NIL;; + cTemplate := DllPrepareCall( <(DllName)>, IIF( <.Pascal.>, DC_CALL_STD, DC_CALL_CDECL ), IIF( <.DllFuncName.>, <(DllFuncName)>, # ) );; + ENDIF;; + ;; + RETURN DllExecuteCall( cTemplate [, ] [, ] ) + + #endif +#endif diff --git a/harbour/contrib/xhb/xhb.hbc b/harbour/contrib/xhb/xhb.hbc index 7c50261287..0d04739b5b 100644 --- a/harbour/contrib/xhb/xhb.hbc +++ b/harbour/contrib/xhb/xhb.hbc @@ -11,3 +11,4 @@ libs=${_HB_DYNPREF}${hb_name}${_HB_DYNSUFF} libs=../hbct/hbct.hbc libs=../hbtip/hbtip.hbc libs=../hbwin/hbwin.hbc +libs=../hbwin/hbxpp.hbc diff --git a/harbour/contrib/xhb/xhb.hbp b/harbour/contrib/xhb/xhb.hbp index 0ba2aee2cf..98eef47360 100644 --- a/harbour/contrib/xhb/xhb.hbp +++ b/harbour/contrib/xhb/xhb.hbp @@ -26,6 +26,7 @@ ../hbct/hbct.hbc ../hbtip/hbtip.hbc ../hbwin/hbwin.hbc +../hbwin/hbxpp.hbc xhb.hbx