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