Ir para conteúdo

POWERED BY:

Arquivado

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

Diego Garcia

Problemas com Ponteiros + Record + DLL

Recommended Posts

Boa tarde amigos.

 

Estou desenvolvendo uma DLL cujo os parâmetros são Records e alguns deles são bem complexos, contendo em sua estrutura outros records e vetores de records.

 

Visando a facilidade na declaração das variáveis criei uma unit unica para armazenar essas estruturas, assim posso compartilhar a mesma entre a DLL e a aplicação que vai interagir com a DLL.

 

Até ai tudo certo. Porem em uma função estou tendo problemas com um dos record.

- Quando passo para a DLL um ponteiro para esse record, os valores ficam todos zerados (inclusive zerando as posições dos vetores).

- Quando passo para a DLL o record direto, olhando pelo Debug só aparecem caracteres "Orientais" e não consigo recuperar nada.

 

já usei ponteiros de record em outros sistemas e nunca tive problema, porem acho que a estrutura desse record em questão esta bem mais complexa do que qualquer uma que já usei.

 

para declarar o ponteiro eu uso:

 

pEstrutura : ^TEstrutura;

 

Estou usando o Delphi2009,

oque pode estar ocasionando esse problema?

Compartilhar este post


Link para o post
Compartilhar em outros sites

E como você esta apontando para este record?

 

Seguindo o exemplo, meu record é o TEstrutura, o ponteiro para ele é um type que criei, o pEstrutura (que nada mais é que ^TEstrutura)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sei que a pergunta é antiga e nem sei se o autor da mesma conseguiu resolver o problema, mas recentemente tive o mesmo e irei compartilhar a solução. No livro do Teixeira & Pacheco, existe um exemplo (extremamente funcional e que uso) em que você utiliza uma unit que contém um tipo record e que armazena alguns valores em variáveis e que a aplicação consegue por sua vez ter acesso a estes dados. Abaixo os exemplos de códigos (adapte para a sua necessidade):

 

.dpr: TESTELIB.dpr

 

library TESTELIB;
{$DEFINE TESTELIB}


uses
  System.SysUtils,
  System.Classes,
  TesteInter in 'TesteInter.pas',
  Vcl.Dialogs;


{$R *.res}


function Retornar(Teste: PTeste): PWideChar; stdcall;
begin
    ShowMessage('entramos.');
    Result := PChar('Entrei!');
    Teste^.vResultado := 'Teste do Saureco!';
end;


exports Retornar;


begin
end.

Unit: TesteInter.pas

 

unit TesteInter;


interface


type
  PTeste = ^TTeste;
  TTeste = record
    vResultado: PChar;
  end;


  {$IFNDEF TESTELIB}
  function Retornar(Teste: PTeste): PWideChar; stdcall;
  {$ENDIF}


implementation


{$IFNDEF TESTELIB}
function Retornar; external 'TESTELIB.DLL' name 'Retornar';
{$ENDIF}


end.

Agora a aplicação:

 

unit FormPrincipal;


interface


uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;


type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  Form1: TForm1;


implementation


{$R *.dfm}


uses TesteInter;


procedure TForm1.Button1Click(Sender: TObject);
var
  Teste: TTeste; //Tipo declarado na Interface TesteInter.pas
begin
    ShowMessage(Retornar(@Teste)); //Resultado da função


    ShowMessage(Teste.vResultado); //Conteudo armazenado em vResultado
end;


end.

Neste form só acrescente um botão e no evento onclick cole o código acima. A unit serve para fazer a vinculação de forma dinâmica a seu aplicativo. Os caracteres orientais são devido a você utilizar o tipo string e não PChar (para usar strings em sua dll, vc deve distribuir junto da mesma a BORLNDMM.DLL. Qualquer coisa tamo aê!

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.