Creación de DLL con xHarbour

Post Reply
User avatar
Vikthor
Posts: 271
Joined: Fri Oct 07, 2005 5:20 am
Location: México

Creación de DLL con xHarbour

Post 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.
Vikthor
User avatar
Vikthor
Posts: 271
Joined: Fri Oct 07, 2005 5:20 am
Location: México

Re: Creación de DLL con xHarbour

Post 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 ?
Vikthor
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Vikthor,

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

Antonio Linares
www.fivetechsoft.com
User avatar
Vikthor
Posts: 271
Joined: Fri Oct 07, 2005 5:20 am
Location: México

Post 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"
Vikthor
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Vikthor,

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

Antonio Linares
www.fivetechsoft.com
User avatar
Vikthor
Posts: 271
Joined: Fri Oct 07, 2005 5:20 am
Location: México

Post 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 ?
Vikthor
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Vikthor,

impdef.exe tutor01.def tutor01.dll

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

Antonio Linares
www.fivetechsoft.com
User avatar
Vikthor
Posts: 271
Joined: Fri Oct 07, 2005 5:20 am
Location: México

Post 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
Vikthor
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post 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á.
regards, saludos

Antonio Linares
www.fivetechsoft.com
Post Reply