Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Enizaldo

TComPort

Recommended Posts

Galera, é o seguinte, preciso resovler um problema com muita urgência e não consigo, por isso recorri aos especialistas deste fórum.

 

Estou utilizando TComPort para acessar a porta serial, até aí tudo tranquilo, mas agora estou com dois problemas: Acessar a função de uma DLL escrita em C++ através do Delphi, e enviar um parâmetro ponteiro, que é o ponteiro alocado pela TComPort para acesso à porta:

 

Código para carregar a função da DLL:

 

unit uExemploDLL;

 

interface

 

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, CPort, StdCtrls, CPortCtl, ExtCtrls;

 

type

TForm1 = class(TForm)

ComPort1: TComPort;

Button1: TButton;

edtRes: TEdit;

btnTeste2: TButton;

procedure Button1Click(Sender: TObject);

procedure btnTeste2Click(Sender: TObject);

 

private

{ Private declarations }

public

{ Public declarations }

end;

 

 

function Escrita(p1: Integer; p2: Integer; p3: Integer; p4: Integer; p5: Integer; p6: Integer; p7: pointer): Boolean; cdecl; external 'arquivo.dll' name 'EscritaNaPlaca';

 

 

Criaei um botão para chamar a função da seguinte forma:

 

procedure TForm1.btnTeste2Click(Sender: TObject);

var

retorno: Boolean;

pont: Pointer;

vDados : String;

begin

pont := ComPort1.VCLComObject; // está certo essa forma de pegar o ponteiro alocado ???

 

Try

retorno := Escrita(1, 0, 0, 0, 0 ,2, pont);

ShowMessage(vDados); // Exibe apenas o dialog... sem nenhum dado

Except

ShowMessage('Erro ao ler.');

end;

end;

 

 

Quando tento executar o programa ele dá o seguinte erro:

"Não foi possível localizar o ponto de entrada do procedimento EscritaNaPlaca na biblioteca de vínculo dinâmico arquivo.dll"

 

Alguém pode me ajudar?

Desde já agradeço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, a solução foi encontrada para carregar e utilizar a função DLL escrita em C++.

 

Como a DLL não foi exportada como cdecl, foi necessária chamar a função por index.

 

Antes era assim:

function Escrita(p1: Integer; p2: Integer; p3: Integer; p4: Integer; p5: Integer; p6: Integer; p7: pointer): Boolean; cdecl; external 'arquivo.dll' name 'EscritaNaPlaca';

 

Agora ficou assim:

function EscritaNaPlacaControladora (p1: Integer; p2: Integer; p3: Integer; p4: Integer; p5: Integer; p6: Integer; p7: pointer): Boolean;

cdecl; external 'arquivo.dll' index 2; // index dois pois era o index da função dentro do arquivo dll, é possível visualizar qual index através do prompt de comando com o "tdump arquivo.dll"

 

Agora o grande problema é:

Como posso encontrar o endereço da porta serial em uso através do TComPort ???

sei que é um ponteiro, se alguém puder me ajduar agradeço

 

valeu

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, a solução foi encontrada para carregar e utilizar a função DLL escrita em C++.

 

Como a DLL não foi exportada como cdecl, foi necessária chamar a função por index.

 

Antes era assim:

function Escrita(p1: Integer; p2: Integer; p3: Integer; p4: Integer; p5: Integer; p6: Integer; p7: pointer): Boolean; cdecl; external 'arquivo.dll' name 'EscritaNaPlaca';

 

Agora ficou assim:

function EscritaNaPlacaControladora (p1: Integer; p2: Integer; p3: Integer; p4: Integer; p5: Integer; p6: Integer; p7: pointer): Boolean;

cdecl; external 'arquivo.dll' index 2; // index dois pois era o index da função dentro do arquivo dll, é possível visualizar qual index através do prompt de comando com o "tdump arquivo.dll"

 

Agora o grande problema é:

Como posso encontrar o endereço da porta serial em uso através do TComPort ???

sei que é um ponteiro, se alguém puder me ajduar agradeço

 

valeu

Olá Enizaldo, estou com o mesmo problema. Estou tentando acessar uma função em uma dll(feita em C++) que recebe um ponteiro como parâmetro. Quando eu executo o código o ponteiro retorna da função sem ser alterado.

 

Está forma de declarar o método externo, com o índice resolve?

 

Att,

Vanessa Aline

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.