Página 1 de 1

Criação de DLL e Uso

Enviado: 30 Jan 2012 09:48
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 

Criação de DLL e Uso

Enviado: 31 Jan 2012 20:46
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()

Criação de DLL e Uso

Enviado: 01 Fev 2012 20:05
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 ?

Criação de DLL e Uso

Enviado: 01 Fev 2012 21:10
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/

Criação de DLL e Uso

Enviado: 02 Fev 2012 21:53
por sygecom
Empaquei aqui, por que preciso gerar no xHarbour, mesmo assim vlw pela dica.

Criação de DLL e Uso

Enviado: 19 Jun 2012 00:27
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

Criação de DLL e Uso

Enviado: 29 Jun 2012 20:07
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