Página 1 de 1

Preciso criar uma .DLL compativel com Harbour...

Enviado: 28 Fev 2006 01:57
por rochinha
Amiguinhos

Estou precisando criar uma .DLL compativel com Harbour.

No DOS usava a blilib para criar minhas .DLLs mas ela é 16bits e preciso criar as .DLLs em formato 32bits.

Alguém sabe de alguma ferramenta e qual a sintaxe.

Obrigado.

@braços :?)

Enviado: 28 Fev 2006 14:06
por Antonio
Amiguinho!

Não me recordo bem, mas tente assim:

implib sua.LIB sua.DLL

Implib.EXE é parte integrante do Borland BCC 5.5

Enviado: 28 Fev 2006 15:15
por rochinha
Amiguinho

Este comando gera uma .LIB de importação a partir de uma .DLL.

Eu preciso do contrário, mas o caminho é por ai.

Valeu.

@braços :?)

Enviado: 02 Mar 2006 10:05
por mou321
Caro Amigo...


Vc Quer Montar uma DLL no xharbour criado com as suas Funcões + recursos é isso ?


mauricio

Enviado: 02 Mar 2006 15:43
por rochinha
Amiguinho

É isto mesmo quero criar algumas .DLL que conterão código particular de clientes como layouts de duplicatas, notas fiscais, etc.

Quanto aos resources também seria interessante pois posso diminuir o tanto de arquivos externos do aplicativo.

Vi algo sobre o DLLWRAP mas o mesmo só encontrei para o mundo Linux.

@braços :?)

Enviado: 02 Mar 2006 16:41
por mou321
Beleza Amigo..

Entaum Vamos lá...


primeiro algumas explicações Basicas...

1) Criei esta DLL para Funcionar Com Qualquer Linguagem inclusive o clipper.


Pontos de Entrada
macrcall.c

Código: Selecionar todos

******************************************************
/*
 * $Id: macrcall.c,v 1.1 2002/02/17 01:24:41 jgiraldo Exp $
   Alterado Para poder receber + parametros e retornalos
 */

#define HB_OS_WIN_32_USED

#include "hbvm.h"
#include "hbapiitm.h"
#include "hbstack.h"

#if defined(HB_OS_WIN_32)

//  Function pointer type
typedef long (__stdcall *CallBackFuncType)(const char* message);


//  Setter function
HB_EXPORT __stdcall void SetCallBack(CallBackFuncType fun);


// funcao Macrocall
void * HB_EXPORT  __stdcall MacroCall( char * sfunc,  char *schar)

{
   char *szFunc = "MacroCall";


   PHB_DYNS pDynSym = hb_dynsymFindName( szFunc ); /* The PRG function to use */

   if( pDynSym )
   {
      hb_vmPushSymbol( pDynSym->pSymbol );
      hb_vmPushNil();
      hb_vmPushString( sfunc, strlen( sfunc ) );
      hb_vmPushString( schar, strlen(schar) );
      hb_vmFunction( 2 ); /* as we receive one parameter */
      strcpy(schar,hb_stack.Return.item.asString.value );
      return "0" ;
   }
   else
      return "0" ;

   }


static CallBackFuncType cbfun = 0;
void __stdcall SetCallBack(CallBackFuncType fun)
{
  CallBackFuncType oldfun = cbfun;
  cbfun = fun;
  return oldfun;
}

HB_FUNC( CALLBACK )
{
  long result = 0;

  if (cbfun != 0)
  {

     result = cbfun( hb_parc( 1 ) );
  }
  else
  {
      MessageBox( NULL,  //HWINDOW of the window that owns the message box
                  "CallBack failed under MacrCall.c" , //Text
                  "Warning" ,//Title
                  MB_OK | MB_ICONINFORMATION );//Bit mask flags
  }

  hb_retl( result );  // QUESTION: If you can make this to return a char pointer
                      // being interpreted correctly by Delphi,
                      // please inform me, I'm all ears, thank you.
}

HB_FUNC( MSGBOX )
   {
      MessageBox( 0, hb_parc( 1 ), "Warning", 0 );
   }

#endif


****************************************************
fim Macrcall

****************************************************
maindll.C

/*
 * $Id: maindll.c,v 1.18 2001/12/28 22:00:47 andijahja Exp $
 */


#define HB_OS_WIN_32_USED

#include "hbvm.h"
#include "hbapiitm.h"

#if defined(HB_OS_WIN_32)

BOOL HB_EXPORT WINAPI DllEntryPoint( HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved )
{
   HB_TRACE( HB_TR_DEBUG, ("DllEntryPoint(%p, %p, %d)", 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;
}

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

   return 0;
}

#endif
************************************************************
Copie cole e crie esses DOIS prog. C

OK

Vou Fazer por partes ..

Enviado: 02 Mar 2006 17:03
por mou321
**
** Aqui o Seu bat para compilar
**
**

*******************************************************
rem
rem $Id: CDLLl.BAT,v 1.2 2002/03/01 19:52:27 jgiraldo Exp $
rem
@ECHO OFF
CLS

ECHO Compiling...

SET hdir=d:\fwh
SET bcdir=d:\bcc\bin
SET OBJETOS=myprog.obj+errorsys.obj

rem na Variavel objetos coloco todos os PRG´s assim , prg1.obj+prg2.obj etc...


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

rem na parte de cima compilo os modulos em C

%hdir%\bin\harbour myprog.prg /n /p /i%hdir%\include %2 %3 > clip.log
@type clip.log
echo -O2 -I%hdir%\include myprog.c > b32.bc
%bcdir%\bcc32 -D -M -c @b32.bc

%hdir%\bin\harbour errorsys.prg /n /p /i%hdir%\include %2 %3 > clip.log
@type clip.log
echo -O2 -I%hdir%\include errorsys.c > b32.bc
%bcdir%\bcc32 -D -M -c @b32.bc

rem na parte de cima compilo uso o harbour e o bcc para meus PRG


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


rem na parte de cima compilo os recursos


echo c0d32.obj + > b32.bc
echo %objetos%+Maindll.obj+macrcall.obj >> b32.bc
echo xhb.dll, + >> b32.bc
echo myprog.map, + >> b32.bc
echo %hdir%\libx\FiveHX.lib %hdir%\lib\FiveHC.lib + >> b32.bc
echo %hdir%\lib\rtl.lib + >> b32.bc
echo %hdir%\lib\DBUTTON32.lib + >> b32.bc
echo %hdir%\lib\vm.lib + >> b32.bc
echo %hdir%\lib\gtwin.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\dbfdbt.lib + >> b32.bc
echo %hdir%\lib\debug.lib + >> b32.bc
echo %hdir%\lib\common.lib + >> b32.bc
echo %hdir%\lib\pp.lib + >> b32.bc
echo %hdir%\lib\rddads.lib + >> b32.bc
echo %hdir%\lib\Ace32.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

IF EXIST myprog.res echo myprog.res >> b32.bc
%bcdir%\ilink32 -Tpd -aa -L%bcdir%\..\lib -L%bcdir%\..\lib\PSDK @b32.bc

rem delete temporary files

IF ERRORLEVEL 1 GOTO LINKERROR
ECHO * criado xhb.DLL successfully built
GOTO EXIT
ECHO

:LINKERROR
rem if exist meminfo.txt notepad meminfo.txt
rem PAUSE * Linking 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

Enviado: 02 Mar 2006 17:25
por mou321
**
** Criando o PRG de Entrada Para DLL
** Conforme o Exemplo que criei
**
**

***
Function Macrocall ( Funcao , Parametro)
***

**
** aqui verfico qual funcao veio e chamo ela

*** varivel abaixo tem que estar vazia


if funcao = "DATE"
parametro = ctod(date())
endif



callbackresult:=""

**** retorno sempre caracter pois estao definadas no ponto de entrada **** do C
**** o ideal é retornar a mesma variavel que veio com o parametro
****


return parametro

Enviado: 04 Mar 2006 17:52
por rochinha
Amiguinho

Este é o código do myprog.prg que vc especificou nas chamadas do arquivo .BC?

Eu consegui compilar os arquivo .C depois de atualizar minha borland com dois patch para a mesma passando-a de 5.5 para 5.5.1.

Estava tambem tentando criar a HARBOUR.DLL através dos sources da versão 45 mas obtive erros na geração em relação ao BISON e FLEX, o primeiro eu encontrei mas o segundo não. Eles são necessários para o término da geração da mesma.

@braços e valeu pela ajuda.

Enviado: 05 Mar 2006 08:17
por mou321
Não este não é o codio original do Myprog.prg , nao postei o original porque é muito grande.

ali so dei um pequeno exemplo , para voce ver que a FUNCAO de seu PRG tem que ser a declarada no Arquivo macrcall.c

Existem 3 maneiras de voce montar uma DLL com o xharbour

uma DLL com todas as Funcoes internas do xharbour

uma DLL com Funcoes em xharbour + nao com as funcoes internas dele

uma DLL com suas funcoes mas somente será usado por um programa em xharbour..

a meneira que lhe mostrei e para ser usado com qualquer linguagem mas fica com todas as funcoes do xharbour


Um abraço