GARANTIR DESCONTO

Fórum Como chamar uma DLL escrita em C #344792

21/08/2007

0

Pessoal...

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

Marcos.gandin

Responder

Posts

21/08/2007

Massuda

Você deve ter declarado em sua unit ´protótipos´ das funções da DLL... experimente fazer assim...
procedure FazMagica(...bla-bla-bla...); cdecl; external ´sua.dll´;



Responder

Gostei + 0

21/08/2007

Marcos.gandin

Massuda

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 ?


Responder

Gostei + 0

21/08/2007

Massuda

Você deveria declarar o ´protótipo´ da função em C++ no Delphi assim...
function BoxProperties(L, H, W: Double; var A, V: Double); external ´minhaDLL.dll´;
...se bem que não lembro se ´double&´ do C++ equivale a ´var X: Double´ do ObjectPascal.


Responder

Gostei + 0

21/08/2007

Marcos.gandin

Tentei fazer como você me falou, mas ainda está dando erro.

Function needs result type


Responder

Gostei + 0

21/08/2007

Massuda

Function needs result type
Tinha esquecido desse detalhe...

Tente assim...
procedure BoxProperties(L, H, W: Double; var A, V: Double); external ´minhaDLL.dll´;



Responder

Gostei + 0

21/08/2007

Marcos.gandin

Troquei function por procedure, mas quando eu chamo está dando o seguinte erro:

Incompatible types: ´Double´ and ´procedure, untyped pointer or untyped parameter´

:?


Responder

Gostei + 0

21/08/2007

Massuda

mas quando eu chamo está dando o seguinte erro:
Mostre como está chamando. Todos os parametros devem ser do tipo Double.

Lembrando que, como é uma procedure, você não pode atribuir o ´retorno da procedure´ a uma variável.


Responder

Gostei + 0

21/08/2007

Marcos.gandin

Este é o código que estou usando:

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;



Responder

Gostei + 0

21/08/2007

Massuda

resultado := BoxProperties(l, h, w, area, volume);
BoxProperties é uma procedure, não retorna valor algum, logo está errado tentar atribuir algum valor a ´resultado´.

ShowMessage(´Valor da Area e do Volume: ´ + FloatToStr(resultado));
BoxProperties aparentemente retorna valores em Area e Volume, conforme a declaração dela em C.


Responder

Gostei + 0

21/08/2007

Marcos.gandin

Mas e como eu vou fazer pra mostrar esses valores uma vez que eu os mando para a DLL ?


Responder

Gostei + 0

21/08/2007

Massuda

Não sei como é essa sua função que está na DLL, mas para mim faz sentido mandar para ela altura, largura e profundidade e receber de volta área e volume.

Acho que você devia apenas mandar os valores L, H e W e mostrar o que retornar em Area e Volume.


Responder

Gostei + 0

21/08/2007

Marcos.gandin

O conteudo da DLL está assim:

// 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.


Responder

Gostei + 0

21/08/2007

Massuda

É exatamente o que escrevi no meu post anterior.


Responder

Gostei + 0

21/08/2007

Emerson Nascimento

Este é o código que estou usando:
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;



Responder

Gostei + 0

21/08/2007

Marcos.gandin

Eu coloquei o código como o emerson.en sugeriu mas ainda assim está dando erro na linha:

ShowMessage(´Os valores são -> Area: ´ + FloatToStr(area) + ´ e Volume: ´+  + FloatToStr(volume));


Operator not applicable to this operand type


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar