Como criar DLL´s com xHarbour

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
Leandroptu
Usuário Nível 1
Usuário Nível 1
Mensagens: 8
Registrado em: 07 Jul 2006 08:09
Localização: Paracatu/MG

Como criar DLL´s com xHarbour

Mensagem 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
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem 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
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Leandroptu
Usuário Nível 1
Usuário Nível 1
Mensagens: 8
Registrado em: 07 Jul 2006 08:09
Localização: Paracatu/MG

Mensagem 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.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem 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
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem 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.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem 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
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Leandroptu
Usuário Nível 1
Usuário Nível 1
Mensagens: 8
Registrado em: 07 Jul 2006 08:09
Localização: Paracatu/MG

Mensagem por Leandroptu »

É realmente estou fazendo pesquisas, e não está rendendo fruto, mas eu sou brasileiro e mineiro..... hheheh
marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Mensagem 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
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem 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...
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Leandro2C
Usuário Nível 1
Usuário Nível 1
Mensagens: 45
Registrado em: 04 Jan 2006 11:06

Mensagem 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.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

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

Mensagem 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]
Responder