Fórum Como chamar uma DLL escrita em C #344792
21/08/2007
0
Em primeiro lugar me desculpem se já possuem tópicos aqui no Fórum que falam sobre assunto, mas é que preciso disso com um pouco de urgência.
Eu tenho uma DLL que foi escrita em C++ e preciso chamar essa DLL no meu sistema que esta sendo desenvolvido em Delphi.
Eu tentei fazer a chamada como eu faria se tivesse escrito essa DLL em Delphi mas não estou conseguindo pois está dando erro que não encontra os parâmetros.
Por favor...quem pouder me ajudar ou dar umas dicas eu agradeço.
Att.
Marcos.gandin
Curtir tópico
+ 0Posts
21/08/2007
Massuda
procedure FazMagica(...bla-bla-bla...); cdecl; external ´sua.dll´;
Gostei + 0
21/08/2007
Marcos.gandin
A minha declaração a DLL está sendo feita da seguinte forma:
function BoxProperties(double L, double H, double W, double& A, double& V); external ´minhaDLL.dll´;
No corpo da DLL escrita em C++, a declaração da função que estou chamando está assim:
extern "C" __declspec(dllexport) void BoxProperties(double Length, double Height, double Width, double& Area, double& Volume);
O que eu estou fazendo de errado ?
Gostei + 0
21/08/2007
Massuda
function BoxProperties(L, H, W: Double; var A, V: Double); external ´minhaDLL.dll´;
Gostei + 0
21/08/2007
Marcos.gandin
Function needs result type
Gostei + 0
21/08/2007
Massuda
Tente assim...
procedure BoxProperties(L, H, W: Double; var A, V: Double); external ´minhaDLL.dll´;
Gostei + 0
21/08/2007
Marcos.gandin
Incompatible types: ´Double´ and ´procedure, untyped pointer or untyped parameter´
:?
Gostei + 0
21/08/2007
Massuda
Lembrando que, como é uma procedure, você não pode atribuir o ´retorno da procedure´ a uma variável.
Gostei + 0
21/08/2007
Marcos.gandin
procedure TfrmTestaDLL.Button1Click(Sender: TObject); var l, h, w, area, volume, resultado : double; begin l := StrToFloat(edtLength.Text); h := StrToFloat(edtHeight.Text); w := StrToFloat(edtWidth.Text); area := StrToFloat(edtArea.Text); volume := StrToFloat(edtVolume.Text); resultado := BoxProperties(l, h, w, area, volume); ShowMessage(´Valor da Area e do Volume: ´ + FloatToStr(resultado)); end;
Gostei + 0
21/08/2007
Massuda
Gostei + 0
21/08/2007
Marcos.gandin
Gostei + 0
21/08/2007
Massuda
Acho que você devia apenas mandar os valores L, H e W e mostrar o que retornar em Area e Volume.
Gostei + 0
21/08/2007
Marcos.gandin
// win32DLL.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
// This function is used to calculate the total area of a parallelepid rectangle
double BoxArea(double L, double H, double W);
// This function is used to calculate the volume of a parallelepid rectangle
double BoxVolume(double L, double H, double W);
// This function is used to get the dimensions of a rectangular parallelepiped
// calculate the area and volume, then pass the calculated values to the
// function that called it.
extern "C" __declspec(dllexport) void BoxProperties(double Length, double Height,
double Width, double& Area, double& Volume);
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
double BoxArea(double L, double H, double W)
{
return 2 * ((L*H) + (L*W) + (H*W));
}
double BoxVolume(double L, double H, double W)
{
return L * H * W;
}
void BoxProperties(double L, double H, double W, double& A, double& V)
{
A = BoxArea(L, H, W);
V = BoxVolume(L, H, W);
}E o código que eu uso pra chamar é aquele que eu postei agora a pouco.
Gostei + 0
21/08/2007
Massuda
Gostei + 0
21/08/2007
Emerson Nascimento
procedure TfrmTestaDLL.Button1Click(Sender: TObject); var l, h, w, area, volume, resultado : double; begin l := StrToFloat(edtLength.Text); h := StrToFloat(edtHeight.Text); w := StrToFloat(edtWidth.Text); area := StrToFloat(edtArea.Text); volume := StrToFloat(edtVolume.Text); resultado := BoxProperties(l, h, w, area, volume); ShowMessage(´Valor da Area e do Volume: ´ + FloatToStr(resultado)); end;
é como o Massuda disse: sua função serve para calcular a área e volume, dados altura, largura e profundidade. logo, o correto seria:
procedure TfrmTestaDLL.Button1Click(Sender: TObject); var l, h, w, area, volume: double; begin l := StrToFloat(edtLength.Text); h := StrToFloat(edtHeight.Text); w := StrToFloat(edtWidth.Text); BoxProperties(l, h, w, area, volume); ShowMessage(´Os valores são -> Area: ´ + FloatToStr(area) + ´ e Volume: ´+ + FloatToStr(volume)); end;
Gostei + 0
21/08/2007
Marcos.gandin
ShowMessage(´Os valores são -> Area: ´ + FloatToStr(area) + ´ e Volume: ´+ + FloatToStr(volume));
Operator not applicable to this operand type
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)