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!


      

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

Responder a