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]