Criação de DLL e Uso

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Criação de DLL e Uso

Mensagem por asimoes »

cdll.prg

Código: Selecionar todos

DYNAMIC Alert

function Another()

   cVar:="teste"
   
   Alert( "Inside the DLL" )

return cVar

function Teste(cVar)

   cVar:="passagem por referencia"

return cVar
cdll.hbp

Código: Selecionar todos

#---------------------------
# Nome da DLL
# ---------------------------
-ocdll
# ---------------------------
# Bibliotecas
# ---------------------------
-lhbmaindllp
# ---------------------------
# Outros Parƒmetros
# ---------------------------
#-workdir=.\OBJ\
-hbdyn
# ---------------------------
# Prg(s) e Rc(s)
# ---------------------------
CDLL.PRG
cdll.bat (para gerar a dll)

Código: Selecionar todos

@echo off
set path=d:\harbour32\bin
SET HB_COMPILER=mingw
hbmk2 cdll.hbp
pause
Testar a DLL
testedll.prg

Código: Selecionar todos

function Main()
   local hDLL := hb_LibLoad( "cdll.dll" )
   cTeste1:=""
   cTeste:=Do( "Another" )
   Alert(cTeste)
   Do( "Teste",@cTeste1)
   Alert( cTeste1 )
   hb_LibFree( hDLL )
return nil

#pragma BEGINDUMP

#include "hbapi.h"

HB_EXPORT_ATTR PHB_FUNC dll_hb_vmProcAddress( const char * szFuncName )
{
   return hb_vmProcAddress( szFuncName );
}

#pragma ENDDUMP  
Para compilar:

Código: Selecionar todos

set hb_compiler=mingw
hbmk2 testedll.prg 
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Criação de DLL e Uso

Mensagem por asimoes »

Olá Galera,

Continuando...

Podemos usar a dll que criamos também desta forma:

Código: Selecionar todos

function Main()
   local hDLL := hb_LibLoad( "cdll.dll" )
   cTeste1:=""
   cTeste:=Do( "Another" )
   Do( "Teste",@cTeste1)
   Alert( cTeste+" - "+cTeste1 )
   hb_LibFree( hDLL )
return nil
Para compilar:
hbmk2 testedll.prg -shared

Neste caso a dll harbour-31.dll tem que estar presente na pasta do teste.
A função abaixo não é necessária:

Código: Selecionar todos

#pragma BEGINDUMP
#include "hbapi.h"
HB_EXPORT_ATTR PHB_FUNC dll_hb_vmProcAddress( const char * szFuncName )
{
   return hb_vmProcAddress( szFuncName );
}
#pragma ENDDUMP  */
Desta forma também pode colocar na dll (cdll.prg) uma função que abra um dbf:

Código: Selecionar todos

DYNAMIC Alert
DYNAMIC DbUseArea

function Another()
   cVar:="teste"
return cVar

function Teste(cVar)
   cVar:="passagem por referencia"
return cVar

function OpenDataBase(cVar)
   DbUseArea(.T.,"DBFNTX",cVar,cVar,.T.)
RETURN Nil
No testedll.prg

Código: Selecionar todos

   Do( "OpenDataBase","CADASTRO")
   dbedit()
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Criação de DLL e Uso

Mensagem por sygecom »

Olá Asimões,

Parabéns pelos exemplos.

Me tira uma duvida, algum desses exemplo de DLL podem ser usado por outro aplicativo que não foi compilado com Harbour ?
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Criação de DLL e Uso

Mensagem por asimoes »

Olá Leonardo,

Pois é, eu também quero isso, o autor das dicas é o Antonio Linares, fiz essa pegunta para ele veja a resposta:

Minha pergunta:
una dll creada en Harbour se puede utilizar en Delphi o VB?

Resposta dele:
Una DLL creada con Harbour solo puede usarse desde otro lenguaje como Delphi, VB, etc. si contiene la máquina virtual de Harbour (HVM) y todas las librerias de ejecución (RTLs). Es decir, una DLL creada con hbmk2 usando el flag -hbdynvm

Aproveito para indicar o endereço do Harbour Project no Facebook:

http://www.facebook.com/groups/harbour.project/
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Criação de DLL e Uso

Mensagem por sygecom »

Empaquei aqui, por que preciso gerar no xHarbour, mesmo assim vlw pela dica.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Criação de DLL e Uso

Mensagem por fladimir »

Acho q to q nem o Leo...

Eu crei a Dll em Harbour e consigo trocar idéia digamos assim entre uma App gerada em Harbour e a Dll tb em Harbour...

Agora como estou com um Bug do xHarbour o qual não consigo retornar o erro extendido, conforme explanado tópico (link)

Pensei em fazer uma Dll em Harbour para fazer o q não esta dando certo em xHarbour e chamar via minha App no xHarbour...

Porém ao tentar compilar o mesmo exemplo da app em Harbour q funciona da o seguinte erro:

Código: Selecionar todos

Error E2141 teste2.prg 74: Declaration syntax error
*** 1 errors in Compile ***
que é referente ao seguinte trecho:

Código: Selecionar todos

#pragma BEGINDUMP
#include "hbapi.h"
HB_EXPORT_ATTR PHB_FUNC dll_hb_vmProcAddress( const char * szFuncName )      //-----> Esta é a linha 74 q se refere o erro
{
   return hb_vmProcAddress( szFuncName );
}
#pragma ENDDUMP  */
Alguém sabe como resolver?

[]´s
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Criação de DLL e Uso

Mensagem por fladimir »

Pessoal eu pesquisei e o q eu entendi é q o Harbour trabalha com um VM diferente do xHarbour q não consegue incorporar na Dll....

Por tanto eu resolvi meu problema através da troca de informações via EXE, ou seja eu criei um EXE em harbour q recebe parametros e ai o aplicativo em xHarbour executa através do RUN mesmo tipo RUN APPEMHARBOUR PAR01 PAR02 PAR03

[]´s
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Responder