Obrigado pela dica do FastMM, já estou pesquisando sobre ele e vou instalar.
 
Como eu citei antes, o teste que fiz funcionou perfeitamente em uma aplicação,
mas foi só copiar a mesma função para a dll e parou de funcionar, agora dá 
exceção
quando vou liberar o PChar no programa.
 
Só pra ficar mais claro, a DLL tem esta função:
 
function GetStrTime: pchar; stdcall;
var St: string;
begin 
  St := 'Hora: ' + TimeToStr(Now); 
  GetMem(Result, Length(St)+1); 
  StrCopy(Result, PChar(St));
end;E o programa que a chama tem esta:
 
procedure TForm1.Button1Click(Sender: TObject);
var i: integer; 
     p: PChar;
begin 
  for i := 1 to 1000 do 
  begin 
    p := GetStrTime; 
    Memo1.Lines.Add(String(P)); 
    FreeMem(p); 
  end;
end;
 
está exatamente igual ao programa de teste, a não ser que GetStrTime
agora está na dll. A exceção acontece na função FreeMem.
 
Pelo jeito o problema não é o uso incorreto do PChar, seria algo que eu 
deveria saber sobre alocação de memória em dll's? Não posso liberar no 
programa memória alocada na DLL? Se for isso como eu poderia resolver a 
situação? A função na DLL tem que retornar uma string e isso vai acontecer 
milhares de vezes durante o processamento, preciso liberar essa string.
O C tem o tipo far para ponteiros que estão em outro módulo, o delphi 
tem algo parecido com isso? Seria esse o problema?
 
Obrigado,
 
Tchesco



To: [EMAIL PROTECTED]: [EMAIL PROTECTED]: Wed, 6 Aug 2008 19:52:23 
-0300Subject: Re: [delphi-br] Dúvidas sobre PChar




Francesco Perrotti wrote:> Agradeço ao Rubens e ao João Morais as explicações, 
realmente foram esclarecedoras.> As vezes fico em dúvida sobre o que o Delphi 
faz automaticamente e o que não faz.> No caso de C é mais simples, ele nunca 
faz nada, a gente tem que fazer tudo, > aí não tem dúvida, só mais trabalho 
:-).Se o tipo for string (ansi string), o Delphi faz tudo. Se não for, o Delphi 
faz nada.> Fiz um programa de teste e aparentemente funcionou. Usei a seguinte 
função, que não é > exatamente o que vou usar na DLL, mas serve como teste:> > 
function GetStrTime: pchar;var St: string;begin St := 'Hora: ' + 
TimeToStr(Now); GetMem(Result, Length(St)+1); StrCopy(Result, PChar(St));end;> 
E pra testar, coloquei um memo no form e o seguinte código em um botão:> > 
procedure TForm1.Button1Click(Sender: TObject);var i: integer; p: PChar;begin 
for i := 1 to 1000 do begin p := GetStrTime; Memo1.Lines.Add(String(P)); 
FreeMem(p); end;end;> > Funcionou a contento, sem dar nenhuma exceção, então 
acho que o problema tá resolvido.Instala o FastMM no seu projeto e liga 
FullDebugMode. Ele é bem melhor que o gerenciador de memória do Delphi (até o 
2005) pra pegar corrupção de memória, sem falar que vai te avisar de 
vazamentos.Joao Morais 





_________________________________________________________________
Instale a Barra de Ferramentas com Desktop Search e ganhe EMOTICONS para o 
Messenger! É GRÁTIS!
http://www.msn.com.br/emoticonpack

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

Responder a