Quando utilizamos arrays dinâmicos do Delphi como parâmetros em funções de uma 
DLL, estes são tratados como ponteiros. Seu eu fosse vc, empacotaria essa sua 
rotina utilitária em um package. Com o package, você poderá declarar funções e 
rotinas que possam lidar tranquilamente tanto com arrays dinâmicos como com 
tipos de dados customizados criados por vc.

 

Boa sorte.

Sds.
 


To: delphi-br@yahoogrupos.com.br
From: evaldoave...@yahoo.com.br
Date: Wed, 13 Jan 2010 05:50:45 -0800
Subject: [delphi-br] Ajuda array dinamico DLL

  



Bom dia!

Estou com problemas em uma função de uma dll que estou criando.
A função recebe um array dinamico de um tipo de dado.

De acordo com a quantidade de informação, a dll altera o tamanho e preenche o 
array.

Na aplicação pego o array e passo para outra função preencher preencher um item 
de um Mainmenu. 
consigo acessar e usar os dados do array que a dll alterou sem erros. 

Mas depois, quando a aplicação já carregou, quando eu clico no item que 
adicionei para o main menu a aplicação da um acess vilation. Percebi que se eu 
não acesso nenhuma posicição do array que veio da dll, dentro da função, o erro 
não ocorre.
Por exemplo :

procedure TForm1.ADDToMenu(var Lista: TListaMenuDLL);
begin
if length(Lista) <= 0 then
exit;

Menu.caption := lista[i].caption //ocorre erro depois que a aplicação foi 
carregada
end;

procedure TForm1.ADDToMenu(var Lista: TListaMenuDLL);
begin
if length(Lista) <= 0 then
exit;

Menu.caption :='Teste' //sem erro 
end;

Pesquisando, descobrir que se a dll aloca memória, ela também destrói. Eu 
mantenho a dll na memória enquanto eu monto menu, só depois ela é liberada. 

Mas eu não estou mais apontando para o array que a dll alocou, então o erro nao 
deveria ocorrer.

Função da dll que me retorna o que preciso:

procedure MenuDLL(var Lista: TListaMenuDLL); stdcall ;
var Item : TMenuDLL;
begin

item := TMenuDLL.Create('DLL','FunçõesCliente');
item.Caption := 'DLL Funções de Clientes';
SetLength( Lista ,( length(lista)+1) );
Lista[length(lista)-1] := (item);

item := TMenuDLL.Create('DLL','CadastroCliente');
item.Caption := 'Cadastro de Cliente';
SetLength(Lista,length(lista)+1 );
Lista[length(lista)-1] := (item);
end;

//Array

type TListaMenuDLL = array of TMenuDLL;

//Tipo de dado
TMenuDLL = record
AssinaturaFuncao: string;
NomeDLL: string;
Caption: string;
end;

uso o delphi 2007

Se aguém puder dar alguma sugestão, Obrigado!

                                          
_________________________________________________________________
Deixe seu computador compatível com a sua vida. Clique para conhecer o Windows 
7!
http://www.microsoft.com/brasil/windows7/default.html?WT.mc_id=1539

[As partes desta mensagem que não continham texto foram removidas]

Responder a