Page 2 of 10

Re: Creating a LIB or DLL

PostPosted: Wed Mar 18, 2009 11:35 pm
by Antonio Linares
Dave,

Please add this code at the beginning of babudll.prg:

extern LoadLibrary, FreeLibrary, AnsiToWide

Please modify buildhd.bat to use gtgui.lib instead of gtwin.lib
and add this library too:

echo %bcdir%\lib\psdk\msimg32.lib + >> b32.bc This one !!!
echo %bcdir%\lib\psdk\rasapi32.lib, >> b32.bc

Re: Creating a LIB or DLL

PostPosted: Thu Mar 19, 2009 3:54 pm
by Dave Zowasky
Antonio,

Still have problem with :

_HB_FUN_LOADLIBRARY
_HB_FUN_FREELIBRARY
_HB_FUN_ANSITOWIDE

Here is my current babudll.prg:

Program:
Code: Select all  Expand view

// To build BabuDLL.dll do: buildhd.bat babuDLL

// To run this DLL, do buidh.bat Babu.prg

extern LoadLibrary, FreeLibrary, AnsiToWide

function Test( cMsg1, cMsg2 )

   MsgInfo( cMsg1, cMsg2 )

return nil
 


Here is my current buildhd.bat :

Code: Select all  Expand view
@ECHO OFF
CLS
ECHO ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
ECHO ³ FiveWin for Harbour 9.02 - Feb. 2009             Harbour development power ³Ü
ECHO ³ (c) FiveTech, 1993-2009      for Microsoft Windows 95/98/NT/2000/ME and XP ³Û
ECHO ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙÛ
ECHO ÿ ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß

@echo off
if A%1 == A GOTO :SINTAX
if NOT EXIST %1.prg GOTO :NOEXIST

ECHO Compiling...

set hdir=c:\harbour
set bcdir=c:\bcc55

%hdir%\bin\harbour %1 /n /i..\include;%hdir%\include /w /p %2 %3 > clip.log
@type clip.log
IF ERRORLEVEL 1 PAUSE
IF ERRORLEVEL 1 GOTO EXIT

echo -O2 -I%hdir%\include;%bcdir%\include %1.c > b32.bc
%bcdir%\bin\bcc32 -M -c @b32.bc
:ENDCOMPILE

IF EXIST %1.rc %bcdir%\bin\brc32 -r %1

echo c0d32.obj + %hdir%\obj\b32\maindll.obj + > b32.bc
echo %1.obj, + >> b32.bc
echo %1.dll, + >> b32.bc
echo %1.map, + >> b32.bc
echo ..\lib\FiveH.lib ..\lib\FiveHC.lib + >> b32.bc
ECHO %hdir%\lib\hbrtl.lib + >> b32.bc
ECHO %hdir%\lib\hbvm.lib + >> b32.bc
ECHO %hdir%\lib\gtgui.lib + >> b32.bc
ECHO %hdir%\lib\hblang.lib + >> b32.bc
ECHO %hdir%\lib\hbmacro.lib + >> b32.bc
ECHO %hdir%\lib\hbrdd.lib + >> b32.bc
ECHO %hdir%\lib\rddntx.lib + >> b32.bc
ECHO %hdir%\lib\rddcdx.lib + >> b32.bc
ECHO %hdir%\lib\hbdebug.lib + >> b32.bc
ECHO %hdir%\lib\hbcommon.lib + >> b32.bc
ECHO %hdir%\lib\hbpp.lib + >> b32.bc
ECHO %hdir%\lib\hbmzip.lib + >> b32.bc
ECHO %hdir%\lib\hbsix.lib + >> b32.bc
ECHO %hdir%\lib\rddfpt.lib + >> b32.bc
ECHO %bcdir%\lib\cw32.lib + >> b32.bc
ECHO %bcdir%\lib\import32.lib + >> b32.bc
ECHO %bcdir%\lib\psdk\odbc32.lib + >> b32.bc
ECHO %bcdir%\lib\uuid.lib + >> b32.bc
echo %bcdir%\lib\psdk\msimg32.lib + >> b32.bc
echo %bcdir%\lib\psdk\rasapi32.lib, >> b32.bc
IF EXIST %1.res echo %1.res >> b32.bc
%bcdir%\bin\ilink32 -Tpd -aa -L%bcdir%\lib;%hdir%\lib @b32.bc

IF ERRORLEVEL 1 GOTO LINKERROR
ECHO * self contained DLL successfully built
GOTO EXIT
ECHO

rem delete temporary files
@del %1.c
@del %1.il?

:LINKERROR
ECHO * There are errors
GOTO EXIT

:SINTAX
ECHO    SYNTAX: Build [Program]     {-- No especifiques la extensi›n PRG
ECHO                                {-- Don't specify .PRG extension
GOTO EXIT

:NOEXIST
ECHO The specified PRG %1 does not exist

:EXIT


Thanks

Re: Creating a LIB or DLL

PostPosted: Thu Mar 19, 2009 8:01 pm
by Antonio Linares
Dave,

Please add this library to buildhd.bat and try it again, thanks:

echo %hdir%\lib\rddfpt.lib + >> b32.bc
echo %hdir%\lib\hbwin.lib + >> b32.bc // this one !
...

Re: Creating a LIB or DLL

PostPosted: Thu Mar 19, 2009 11:28 pm
by Dave Zowasky
Antonio,

Added the line to the batch file and it creates the dll, however when I compile babu.prg and run
it I am getting :

An exception error(C0000005) occurred during DllEntryPoint or DllMain in module:
c:\fwh\samples\babudll.dll


Thanks

Re: Creating a LIB or DLL

PostPosted: Fri Mar 20, 2009 2:00 am
by Antonio Linares
Dave,

Where have you downloaded maindll.c from ?

How have you compiled maindll.c ? What compiler flags have you used ?

Re: Creating a LIB or DLL

PostPosted: Fri Mar 20, 2009 1:28 pm
by Dave Zowasky
Antonio,

I used the latest maindll.c from the harbour-1.0.1\source\vm\maindll.c

I can post it if needed:

I added this to my buildhd.bat

%bcdir%\bin\bcc32 -c -D__EXPORT__ -I%hdir%\include;%bcdir%\include -L%bcdir%\..\lib maindll.c

Thanks

Re: Creating a LIB or DLL

PostPosted: Fri Mar 20, 2009 2:55 pm
by vailtom
Code: Select all  Expand view
%bcdir%\bin\bcc32 -c -D__EXPORT__ -I%hdir%\include;%bcdir%\include -L%bcdir%\..\lib maindll.c

The are changed __EXPORT__ macro to HB_DYNLIB:
Code: Select all  Expand view
2008-08-16 16:16 UTC+0200 Viktor Szakats (harbour.01 syenar hu)
   * make_b32.mak
   * make_gcc.mak
   * make_vc.mak
   * make_vcce.mak
   * include/hbdefs.h
   * source/vm/mainwin.c
   * source/vm/hvm.c
   * source/hbpcre/_hbconf.h
   * source/hbzlib/ChangeLog
   * source/hbzlib/zconf.h
   * utils/hbmake/hbmake.prg
     * __EXPORT__ -> HB_DYNLIB
 

See INSTALL file into source tree for more info.

Re: Creating a LIB or DLL

PostPosted: Fri Mar 20, 2009 3:06 pm
by Dave Zowasky
Vailton,

I appreciate the info, however I am not sure what to do with it.

Do I need to change my batch file from __EXPORT__ to HB_DYNLIB ?

Thanks

Re: Creating a LIB or DLL

PostPosted: Fri Mar 20, 2009 3:34 pm
by vailtom
When you compile a .DLL should not use the macro __EXPORT__ as it is in changelog, this was changed.
Maybe this could be it mixed in the command line you posted above.

Re: Creating a LIB or DLL

PostPosted: Fri Mar 20, 2009 3:53 pm
by Antonio Linares
Dave,

> Do I need to change my batch file from __EXPORT__ to HB_DYNLIB ?

Yes

Once the DLL is built, please do:

impdef.exe YourDll.DEF YourDll.DLL

and check the contents of YourDll.DEF. It is an ascii file that shows what symbols are exported from the DLL.

Re: Creating a LIB or DLL

PostPosted: Fri Mar 20, 2009 4:41 pm
by Dave Zowasky
Antonio,

Got this in mydll.def

LIBRARY BABUDLL.DLL

EXPORTS
__DbgWndProc @1 ; __DbgWndProc
__WndProc @2 ; __WndProc
___CPPdebugHook @3 ; ___CPPdebugHook

Not sure what to do next.

Thanks

Re: Creating a LIB or DLL

PostPosted: Fri Mar 20, 2009 8:34 pm
by Antonio Linares
Dave,

These lines should be inside the DEF file:

DllEntryPoint @894 ; DllEntryPoint
HBDLLENTRY @895 ; HBDLLENTRY
HBDLLENTRY1 @896 ; HBDLLENTRY1
HBDLLENTRY2 @897 ; HBDLLENTRY2

Those numbers can be different.

If you don't have them, then it means that maindll.obj is not being properly built.

Re: Creating a LIB or DLL

PostPosted: Fri Mar 20, 2009 8:42 pm
by Antonio Linares
Dave,

Please make these changes in maindll.c, and compile it again and build the DLL:

BOOL WINAPI __export DllEntryPoint( HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved )

LONG PASCAL __export HBDLLENTRY( char * cProcName )

LONG PASCAL __export HBDLLENTRY1( char * cProcName, LONG pItem )

LONG PASCAL __export HBDLLENTRY2( char * cProcName, LONG pItem1, LONG pItem2 )

Re: Creating a LIB or DLL

PostPosted: Fri Mar 20, 2009 10:02 pm
by Dave Zowasky
Antonio,

Like:

HB_EXPORT BOOL WINAPI DllEntryPoint( HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved )

to

BOOL WINAPI _export DllEntryPoint( HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved )

Also

You have
__export

should I use?
_export


Correct?

If so still have same


Thanks



Code: Select all  Expand view
HB_EXPORT BOOL WINAPI DllEntryPoint( HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved )
{
   HB_TRACE( HB_TR_DEBUG, ("DllEntryPoint(%p, %p, %p)", hInstance, fdwReason,
             pvReserved ) );

   HB_SYMBOL_UNUSED( hInstance );
   HB_SYMBOL_UNUSED( fdwReason );
   HB_SYMBOL_UNUSED( pvReserved );

   switch( fdwReason )
   {
      case DLL_PROCESS_ATTACH:
           hb_vmInit( FALSE );  /* Don't execute first linked symbol */
           break;

      case DLL_PROCESS_DETACH:
           hb_vmQuit();
           break;
   }

   return TRUE;
}

HB_EXPORT LONG PASCAL HBDLLENTRY( char * cProcName )
{
   hb_itemDoC( cProcName, 0, 0 );

   return 0;
}

HB_EXPORT LONG PASCAL _export HBDLLENTRY1( char * cProcName, LONG pItem )
{
   hb_itemDoC( cProcName, 1, ( PHB_ITEM ) pItem, 0 );

   return 0;
}

HB_EXPORT LONG PASCAL t HBDLLENTRY2( char * cProcName, LONG pItem1, LONG pItem2 )
{
   hb_itemDoC( cProcName, 2, ( PHB_ITEM ) pItem1, ( PHB_ITEM ) pItem2, 0 );

   return 0;
}
 

Re: Creating a LIB or DLL

PostPosted: Fri Mar 20, 2009 10:46 pm
by Antonio Linares
Dave,

Just to be sure that HB_EXPORT gets properly translated, better replace those lines as I have explained you and compile it again.