Página 1 de 1

Como criar DLL´s com xHarbour

Enviado: 02 Out 2007 13:14
por Leandroptu
Olá

Pessoal,

Gostaria do apoio de vocês para me explicar, qual é a melhor maneira para geração de DLL´s com tratamento de rotinas e funções na mesma, com o aplicativo externo.

Fivewin 2.7 + XHarbour Build 0.99.60 + WorkShop + vLib + SqlLib + MySQL 5.0

Enviado: 02 Out 2007 17:23
por sygecom
Alguem me corriga se eu estiver errado, vc simplesmente cria uma LIB com ( HBMAKE SUALIB /ELX ) contendo funções e gera a DLL com a IMPLIB do BCC55 ex:

implib minhalib.dll minhalib.lib

Obs:Nunca fiz isso, teria que testar, apenas isso seria o processo contrario de como eu gero a LIB atravez da DLL do MYSQL(LIBMYSQL.DLL)

Abraços
Leonardo Machado

Enviado: 03 Out 2007 08:49
por Leandroptu
Bom eu não uso o HBMAKE SUALIB /ELX é free, onde eu posso baixa-lo, Sr. Leonardo ja me disseram que existe um software que converte .prg para .Dll. Já ouviu fala algum assim obrigado.

Enviado: 03 Out 2007 12:10
por sygecom
De .PRG para DLL nunca ouvi fala, e o HBMAKE É OPEN SOURCE ele vem junto com o xharbour, e se encontra na pasta xharbour\bin

Enviado: 03 Out 2007 13:10
por rochinha
Amiguinho Sygecom,

Corrigindo:

O implib apenas cria LIBs a partir de DLLs e não o contrário.

O caso de usar DLLs com funções foi discutido no forum internacional de Fivewin e ninguem chegou a lugar nenhum.

Nos forums de xHarbour talvez voce consiga algo.

Eu mesmo não consegui criar uma DLL assim e usei outros métodos para suprir esta(minha) deficiencia.

E outra coisa, para criar uma DLL de função ela deve realmente possuir um intuito pois se as funções da DLL necessitam realmente ali existir coloque diretamente no .EXE.

Quando uma DLL de funções se faz valida?

Se o seu sistema possui um módulo de ECF, voce pode sacar o uso de DLLs de funções, sendo que voce tera uma DLL com funções especificas para cada ECF.

Se o seu sistema emite notas fiscais e para cada cliente voce tem uma configuração diferente no codigo de impressão, voce cria uma DLL de nota fiscal para cada cliente.

Então, pense bem pois o trabalho para cria-la é embassado.

Enviado: 03 Out 2007 13:15
por sygecom
Entendi, e desculpa.....apenas tive a idéia que poderia talvez ser por ai o caminho, mas se já foi discutido e não acharam o furo da Bala, então fica para outra vez....

Abraços
Leonardo Machado

Enviado: 03 Out 2007 14:01
por Leandroptu
É realmente estou fazendo pesquisas, e não está rendendo fruto, mas eu sou brasileiro e mineiro..... hheheh

Enviado: 04 Out 2007 14:30
por marcos.gurupi
Eh obvio e indiscutivel a eficiencia do xhb, mas acho um problema n poder acessar qualquer dll pelo proprio xhb, sempre q c discuti isso nos foruns onde passei o luiz sugere criar o acesso em liguagem c, mas nem todos dominamos essa linguagem, eu mesmo tive um problema: estou implementando o a consulta checkcheck no sistema, o pessoal me passou todos os exemplos e a dll, mas n tive como acessar a dll por limitacao do xhb, entaum me foi sugerido a criacao de um arquivo em c para acessar as funcoes da dll, ou seja, "gambiarra" :)

Mas eu acredito q isso jah deve estah sendo pensado nas versoes posteriores. O acesso nativo em dll eh assencial para qualquer linguagem 32/64 bits.

Marcos Roberto

Enviado: 04 Out 2007 15:03
por rochinha
Amiguinhos

É claro que neste caso esta demorado demais para que este problema seja sanado, tendo em vista que em se tratando do mundo harbour o mesmo vinha trabalhando muito bem com VBX e DLL em 16 bits.

Vejam que o avanço do Harbour(quando falo Harbour falo do compilador, seja o tradicional ou o X) a questão de acesso OLE tomou um rumo que nem imaginariamos hoje com o que é possivel.

Em relação ao campo das VBXzes que não são mais usadas nem acessadas via Harbour houve um grande progresso quando se foi possivel acessar Activex via DLLs Actives e OCXzes.

Se devemos jogar pedras?

Devemos sim, mas devemos dar Graças a Deus e bater palmas, muitas palmas para a iniciativa de pequeninos que fizeram o que as grandes empresas simplesmente jogaram no ralo.

Vamos continuar aguardando...

Enviado: 03 Mar 2008 15:04
por Leandro2C
Pegando carona no que o colega Marcos falou, tenho 1 coletor de dados com dll p/ VB e Delphi. O técnico me enviou p/ VFP, que nessa linguagem funcionou blz. Usando essa dll p/ VFP com xharbour, o acesso funciona somente na primeira vez, dando o retorno 1, retornando 0 na segunda tentativa (mesmo sendo uma imediatamente à outra). Tenho que fechar o sistema p/ funcionar novamente o coletor. Resumindo: nesse caso tb o indicado seria fazer uma rotina em C ?

Obrigado
Leandro.

Re: Como criar DLL´s com xHarbour (FW)

Enviado: 03 Mar 2008 15:41
por Itamar M. Lins Jr.
Leandroptu escreveu:Olá

Pessoal,

Gostaria do apoio de vocês para me explicar, qual é a melhor maneira para geração de DLL´s com tratamento de rotinas e funções na mesma, com o aplicativo externo.

Fivewin 2.7 + XHarbour Build 0.99.60 + WorkShop + vLib + SqlLib + MySQL 5.0
Ola!
Veja se essa dica do reinaldo serve.
Saudações
Itamar M. Lins Jr.


Olá, tudo bem?

Pessoal, eu percebi que tem muita gente que pretende criar e usar DLLs a
partir de uma rotina feita em xHarbour!.

Então vamos começar:

Vamos criar nossa DLL?

Primeiro vamos criar um arquivo chamado "minhaDLL.cpp"

/*.................................................................................................................................*/
/* minhaDLL.cpp */
/* em 22/02/2008 às 18:52
/*.................................................................................................................................*/
#include <windows.h>
BOOL WINAPI DllEntryPoint(HINSTANCE, DWORD, LPVOID)
{
return TRUE;
}

extern "C"
int __declspec(dllexport) WINAPI Somar(int i, int j)
{
return i + j;
}


extern "C"
int __declspec(dllexport) WINAPI Alerta(LPSTR msg , LPSTR titulo)
{
return MessageBox( NULL, msg, titulo, 0 );
}
/*.................................................................................................................................*/


pronto, nesse ponto o nosso arquivo está criado.
agora vamos criar um arquivo de cabeçalho (header) para a DLL

/*.................................................................................................................................*/
/* minhaDLL.h */
/* em 22/02/2008 às 18:56
/*.................................................................................................................................*/

#ifndef MINHA_DLL_H
#define MINHA_DLL_H

#ifdef __cplusplus
extern "C"
#endif

int __declspec(dllimport) WINAPI Somar(int i, int j);
int __declspec(dllimport) WINAPI Alerta(LPSTR msg , LPSTR titulo);
#endif
/*.................................................................................................................................*/

Agora, vamos compilar e gerar nossa DLL!

No prompt de comandos, vamos digitar:

bcc32 -WDR minhaDLL (ENTER)

Se tudo deu certo, foi criado um arquivo chamado "minhaDLL.dll"

Proximo passo, vamos importar esta DLL para a forma estática, ou seja, uma
LIB.

No prompt de comandos, vamos digitar:

Implib -c minhaDLL.lib minhaDLL.dll

pronto, foi criada a nossa LIB!

Proximo passo:
vamos testar nossa DLL?

Então vamos criar um arquivo chamado "tstminhaDLL.prg"
/*
............................................................................................................................*/
/* arquivo: tstminhaDLL.prg - em 22/02/2008 às 19:05 */
/*
............................................................................................................................*/
procedure main()
Local i
for i := 1 to 5
alerta( "A soma retornada da DLL soma de "+;
str(10+i)+" + "+str(5+i)+" = "+;
Str(Somar(10+i,5+i)), "Titulo" )
next
return
/*
............................................................................................................................*/
/*
............................................................................................................................*/

Neste ponte, vamos perguntar, mas como meu PRG vai enxergar a função
"Alerta()"
sendo que ela está fora do PRG?

Então vamos criar mais um arquivo:
como já começamos a usar xHarbour em nosso PRG, vamos agora usar esse
poderosa ferramenta:

/*
............................................................................................................................*/
/* arquivo: minhaDLLc.C - em 22/02/2008 às 19:15 */
/*
............................................................................................................................*/
#include "windows.h"
#include "hbapi.h"

#define DllImport extern __declspec( dllimport )
DllImport int __stdcall Somar(short int* i, short int* j );

typedef INT (WINAPI * _SOMAR)( INT i, INT j );
typedef INT (WINAPI * _ALERTA)( LPSTR msg , LPSTR titulo );

HB_FUNC( SOMAR )
{
HINSTANCE handle = LoadLibrary( "minhaDLL.dll" );

if ( handle )
{
INT i = hb_parni( 1 );
INT j = hb_parni( 2 );

_SOMAR pFunc;

pFunc = ( _SOMAR ) GetProcAddress( handle, "Somar");
hb_retni( pFunc( i,j ));

FreeLibrary( handle );
}
}
/*
............................................................................................................................*/

Pronto,

agora precisamos compilar nosso PRG, junto com esse arquivo "minhaDLLc.c"
e linkar junto com a "minhaDLL.lib"

Eu faço de conta que vc já sabe compilar e linkar no xHarbour, usando o
Hbmake, ou algum arquivo .bat para compilar..

Então, agora é com vc.... pode compilar e testa... e me diga o resultado!
Gostou? então podemos criar DLLs bem mais complexas, baseado neste pequeno
exemplo.

[]s
Reinaldo Henrique....
Olá,

Eu tinha esquecido de colocar a função Alerta()... junto com a outra
(Somar())

eis aqui....


HB_FUNC( ALERTA )
{
HINSTANCE handle = LoadLibrary( "minhaDLLl.dll" );

if ( handle )
{
char msg[ 250 ] = { 0 } ;
char titulo[ 250 ] = { 0 } ;

_ALERTA pFunc;
strcpy( msg, hb_parc( 1 ) );
strcpy( titulo, hb_parc( 2 ) );

pFunc = ( _ALERTA ) GetProcAddress( handle, "Alerta");
hb_retni( pFunc( msg, titulo ));
FreeLibrary( handle );
}
}


[]s
Reinaldo Henrique
[/quote]