Enizaldo 0 Denunciar post Postado Outubro 29, 2008 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
Enizaldo 0 Denunciar post Postado Novembro 2, 2008 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
VanessaAline 0 Denunciar post Postado Novembro 19, 2008 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