Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
E aí galera!!
Estou tentando usar dlls criadas no delphi , só que estou tendo problemas para dclarar os tipos.Quetipos de dados devo utilizar em dlls?
DEsde já agradeço.
Bom dia,
Recentemente tive que criar uma dll no Delphi que seria utilizada em diversos sistemas, como VB e C++
tive que usar apenas tipos primitivos nas variaveis das funções exportadas pela dll
Os tipos que usei foram Integer, Pchar e Double.
Um exemplo de dll segue abaixo :
//Exemplo da dll gerada em Delphi :
library DllTeste;
uses
SysUtils,
Classes,
Dialogs;
{$R *.res}
//Exemplo de função com passagem por referencia e com retorno
function minhafunc(var Erro: Pchar ): Integer ; stdcall;
Var Campo : String ;
begin
showmessage( 'PASSOU NA DLL. texto recebido:' + Erro ) ;
result := 1 ;
Campo := 'Passagem de Valor por referência';
Erro := PChar( Campo );
end;
function minhafunc2(Erro: Pchar ): Integer ; stdcall;
begin
showmessage( 'PASSOU NA DLL. texto recebido:' + Erro ) ;
result := 1 ;
end;
Exports
minhafunc,
minhafunc2;
begin
end.
#############################################################################
'Exemplo de chamada nesta dll Delphi em Visual Basic 2008
Public Class Form1
Private Declare Function minhafunc Lib _
"DllTeste" (ByRef sErro As String) As Integer
Private Declare Function minhafunc2 Lib _
"DllTeste" (ByVal sErro As String) As Integer
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim TextoEnviado As String
TextoEnviado = "Teste"
'Chama a Dll com passagem de valor por referência
If minhafunc(TextoEnviado) Then
MsgBox("Ok Foi. Texto Recebido : " + TextoEnviado)
End If
'Chama a Dll com passagem de valor por referência
If minhafunc2(TextoEnviado) Then
MsgBox("Ok Foi.")
End If
End Sub
End Class
################################################################################
#######
//Exemplo de chamada de Delphi Dll no C++
//$$---- Form CPP ----
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//Exemplo de Passagem de valor por referência de Dll do Delphi para C++ Builder
typedef int (importFunction)(LPCSTR); //Tipagem da da função
importFunction myfunc;
double result;
LPCSTR VarPassada;
VarPassada = "esse valor foi passado para função";
LPCSTR* pVarPassada; //Ponteiro usado para passagem por referencia
pVarPassada = &VarPassada; //Ponteiro recebe o valor da variavel a ser passada
// Carregar a dll do Delphi
HINSTANCE hinstLib = LoadLibrary(TEXT("DllTeste"));
if (hinstLib == NULL) {
MessageBox(0,"Ocorreu um erro ao abrir a dll!","Erro",0x10);
}
// Ponteiro para a função da Dll
myfunc = (importFunction)GetProcAddress(hinstLib, "minhafunc");
if (myfunc == NULL) {
MessageBox(0,"Ocorreu um erro ao abrir função da Dll. Função não encontrada.!","Erro",0x10);
FreeLibrary(hinstLib);
}
MessageBox(0,strcat("Valor passado : ", VarPassada ),"Valor por referência",0x10);
// Chamada da função
result = myfunc(pVarPassada);
MessageBox(0,VarPassada,"Valor recebido por referência",0x10);
// Unload DLL file
FreeLibrary(hinstLib);
// Display result
MessageBox(0,"FIM DO PROCESSO!","Erro",0x10);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
//Exemplo de Passagem de valor por valor de Dll do Delphi para C++ Builder
typedef int (*importFunction)(LPCSTR); //Tipagem da da função
importFunction myfunc2;
double result;
LPCSTR VarPassada;
VarPassada = "esse valor foi passado para função";
// Carregar a dll do Delphi
HINSTANCE hinstLib = LoadLibrary(TEXT("DllTeste"));
if (hinstLib == NULL) {
MessageBox(0,"Ocorreu um erro ao abrir a dll!","Erro",0x10);
}
// Ponteiro para a função da Dll
myfunc2 = (importFunction)GetProcAddress(hinstLib, "minhafunc2");
if (myfunc2 == NULL) {
MessageBox(1,"Ocorreu um erro ao abrir função da Dll. Função não encontrada.!","Erro",0x10);
FreeLibrary(hinstLib);
}
MessageBox(2,strcat("Valor passado : ", VarPassada ),"Valor por valor",0x10);
// Chamada da função
result = myfunc2(VarPassada);
// Unload DLL file
FreeLibrary(hinstLib);
// Display result
MessageBox(0,"FIM DO PROCESSO!","Erro",0x10);
}
//---------------------------------------------------------------------------
##############################################################3333
Espero ter ajudado
Reginaldo Donizete Felix
Analista de Sistemas
msn: regifelix@hotmail.com
Beleza galera valeu a ajuda.
Já consegui fazer o q eu queria.
abraços!
Bom, normalmente os tipos reconhecidos de dados em DLL's são:
String - Integer - Double
Como assim problemas, quando você está criando a dll? Quando compila?
Talvez faça o post do código que está utilizando para que possamos analisar.
Att