Page 1 of 1

Creación de DLL con xHarbour

Posted: Fri Nov 17, 2006 4:41 am
by Vikthor
Hola a todos :

Estoy intentando crear un archivo dll desde un Prg, más sin embargo aunque la creación del archivo dll sí se realiza, cuando hago el llamado a alguna función desde otro PRG, simplemente no se ejecuta.

Los archivos que estoy usando de prueba son tutor01.prg y testdll.prg

Code: Select all


Compiling...
xHarbour Compiler build 0.99.61 (SimpLex)
Copyright 1999-2006, http://www.xharbour.org http://www.harbour-project.org/
Compiling 'tutor01.prg' and generating preprocessed output to 'tutor01.ppo'...
Lines 26, Functions/Procedures 3
Generating C source output to 'tutor01.c'...
Done.
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
tutor01.c:
Borland Resource Compiler  Version 5.40
Copyright (c) 1990, 1999 Inprise Corporation.  All rights reserved.
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
* self contained DLL successfully built
Aquí me indica que la creación de la dll fue correcta.


Esta es la configuración del archivo buildhd.bat que estoy usando para crear la DLL

Code: Select all

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

ECHO Compiling...

set hdir=c:\xharbour
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 %1.c > b32.bc
%bcdir%\bin\bcc32 -M -c @b32.bc
:ENDCOMPILE

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

echo c0d32.obj + > b32.bc
echo %1.obj, + >> b32.bc
echo %1.dll, + >> b32.bc
echo %1.map, + >> b32.bc
echo ..\lib\FiveHx.lib ..\lib\FiveHC.lib + >> b32.bc
echo %hdir%\lib\rtl.lib + >> b32.bc
echo %hdir%\lib\vm.lib + >> b32.bc
rem echo %hdir%\lib\gtwin.lib + >> b32.bc
echo %hdir%\lib\gtgui.lib + >> b32.bc
echo %hdir%\lib\lang.lib + >> b32.bc
echo %hdir%\lib\macro.lib + >> b32.bc
echo %hdir%\lib\rdd.lib + >> b32.bc
echo %hdir%\lib\dbfntx.lib + >> b32.bc
echo %hdir%\lib\dbfcdx.lib + >> b32.bc
echo %hdir%\lib\dbffpt.lib + >> b32.bc
echo %hdir%\lib\hbsix.lib + >> b32.bc
echo %hdir%\lib\debug.lib + >> b32.bc
echo %hdir%\lib\common.lib + >> b32.bc
echo %hdir%\lib\pp.lib + >> b32.bc
rem echo %hdir%\lib\codepage.lib + >> b32.bc

rem Uncomment these two lines to use Advantage RDD
rem echo %hdir%\lib\b32\rddads.lib + >> b32.bc
rem echo ..\lib\Ace32.lib + >> b32.bc

echo %bcdir%\lib\import32.lib + >> b32.bc
echo %bcdir%\lib\cw32.lib + >> b32.bc
echo %bcdir%\lib\psdk\odbc32.lib, >> b32.bc
IF EXIST %1.res echo %1.res >> b32.bc
%bcdir%\bin\ilink32 -Tpd -aa @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
Estoy usando xHarbour.

Alguna sugerencia de que estoy mal.

Re: Creación de DLL con xHarbour

Posted: Tue Nov 21, 2006 3:03 pm
by Vikthor
Vikthor wrote:Hola a todos :

Estoy intentando crear un archivo dll desde un Prg, más sin embargo aunque la creación del archivo dll sí se realiza, cuando hago el llamado a alguna función desde otro PRG, simplemente no se ejecuta......................................
Antonio alguna sugerencia ?

Posted: Wed Nov 22, 2006 8:01 am
by Antonio Linares
Vikthor,

Cómo estas llamando a las funciones de la DLL ?

Posted: Wed Nov 22, 2006 2:26 pm
by Vikthor
Antonio Linares wrote:Vikthor,

Cómo estas llamando a las funciones de la DLL ?

Code: Select all

// Using Harbour DLLs
// To build Tutor01.dll do: buildhd.bat tutor01

#include "FiveWin.ch"

function Main()

   HbDLLEntry( "MAIN" )
   MsgInfo( "ok from EXE" )

return nil

DLL FUNCTION HBDLLENTRY( cProc AS LPSTR ) AS LONG PASCAL LIB "Tutor01.dll"

Posted: Wed Nov 22, 2006 5:43 pm
by Antonio Linares
Vikthor,

Haz un impdef de la DLL y asegúrate de que HBDLLENTRY() está exportada.

Posted: Wed Nov 22, 2006 5:50 pm
by Vikthor
Antonio Linares wrote:Vikthor,

Haz un impdef de la DLL y asegúrate de que HBDLLENTRY() está exportada.
Ahora si navego con bandera de ignorante, ¿ me podrías explicar que significa lo que estas sugiriendo ?

Posted: Wed Nov 22, 2006 6:01 pm
by Antonio Linares
Vikthor,

impdef.exe tutor01.def tutor01.dll

Mira dentro de tutor01.def (es un fichero ascii) a ver si está HBDLLENTRY.

Posted: Thu Nov 23, 2006 1:14 am
by Vikthor
Antonio Linares wrote:Vikthor,

impdef.exe tutor01.def tutor01.dll

Mira dentro de tutor01.def (es un fichero ascii) a ver si está HBDLLENTRY.
Antonio :

Hice lo que me sugeriste y no esta contenida HBDLLENTRY. dentro de tutor01.dll

Code: Select all

LIBRARY     TUTOR01.DLL

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

Posted: Thu Nov 23, 2006 7:50 am
by Antonio Linares
Vikthor,

Ese es el problema, por eso no te funciona, porque no está exportada la función HBDLLENTRY.

Estás usando xHarbour ? Revisa xharbour\source\vm\maindll.c y comprueba que tienes esto:

Code: Select all

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

   return 0;
}
Observa que usa HB_EXPORT por lo que finalmente debería aparecer en el fichero DEF. Mientras no aparezca, no te funcionará.