Como criar DLL´s com xHarbour
Moderador: Moderadores
- Leandroptu
- Usuário Nível 1

- Mensagens: 8
- Registrado em: 07 Jul 2006 08:09
- Localização: Paracatu/MG
Como criar DLL´s com xHarbour
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
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
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
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
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
xHarbour.org + Hwgui + PostgreSql
- Leandroptu
- Usuário Nível 1

- Mensagens: 8
- Registrado em: 07 Jul 2006 08:09
- Localização: Paracatu/MG
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
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.
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.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
- Leandroptu
- Usuário Nível 1

- Mensagens: 8
- Registrado em: 07 Jul 2006 08:09
- Localização: Paracatu/MG
-
marcos.gurupi
- Usuário Nível 4

- Mensagens: 939
- Registrado em: 06 Jul 2004 11:53
- Localização: Gurupi-TO
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
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
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
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...
É 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.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
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.
Obrigado
Leandro.
- Itamar M. Lins Jr.
- 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)
Ola!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
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....
[/quote]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