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 :-). 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. Obrigado pela ajuda. Tchesco
To: [EMAIL PROTECTED]: [EMAIL PROTECTED]: Wed, 6 Aug 2008 13:17:00 +0000Subject: RE: [delphi-br] Dúvidas sobre PChar Particularmente, dependendo do parâmetro e/ou do tipo de retorno da função que estou escrevendo para uma DLL, uso ou ShortString ou WideString. Além de poder tratar strings como costumeiramente faria usando o tipo string, evita de ter que distribuir a BORLANDMM.DLL.Sds.________________________________To: [EMAIL PROTECTED]: [EMAIL PROTECTED]: Wed, 6 Aug 2008 08:20:16 -0300Subject: Re: [delphi-br] Dúvidas sobre PCharFrancesco Perrotti wrote:> Oi pessoal,>> Tenho algumas dúvidas sobre o uso de PChar, agradeceria alguma ajuda.>> É o seguinte, fiz uma DLL com uma função que precisa retornar uma string, portanto tenho que usar um PChar> já que provalvelmente a DLL será usada com linguagem C.Se você envia strings para a dll, você pode criar um tipo string e fazerum cast para pchar. Uma ansi string é compatível com pchar internamente.> Só que ainda não consegui entender direito como o Delphi trata esse tipo. Por exemplo,> se eu declarar em uma função:>> var p:pchar;>> o que exatamente o delphi cria? apenas um ponteiro para chars? ele já aloca memória> para conter strings? se eu tiver que retornar um pchar por uma função, por exemplo:Nada de alocação, apenas um tipo ponteiro.> function Hello: pchar;> begin> result := 'Hello';> end;'Hello' é uma literal que é alocada e liberada pelo compilador, e nestecaso específico você não terá problemas nem com memória corrompida nemcom vazamento.> isso está correto? ou tenho que alocar memória para o pchar como eu teria que fazer em c?É como programar em C, exatamente. No caso acima você não precisa alocarporque a string é uma literal, mas nos demais casos você tem que cuidarse as rotinas que você está manipulando estão alocando memóriacorretamente. E se estão alocando, tenha em mente aonde e como elasserão desalocadas.> nesse caso o delphi já coloca o terminador zero no final ou eu devo colocar explicitamente?Ansi strings são compatíveis com pchar, elas já possuem um #0 no final.Até isso o Delphi e o fpc faz por nós.> E no lugar onde faço a chamada a essa função, depois eu tenho que liberar a memória?> Por exemplo:>> var p: pchar;> begin> p := Hello;>> e agora? depois de usar a string em p o que eu devo fazer? liberar a memória? ou o delphi já faz isso?> No help do delphi há exemplos usando arrays de char que depois são "casteados" para pchar,Usando um array de char (com um #0 no final) ou string, o compilador iráalocar e desalocar a memória por você, mas cuidado para não mandar umastring para outra rotina sendo que a string foi alocada localmente (talcomo uma variável local). Depois que a sua rotina terminar, babaustring. Exemplo, isto aqui funciona:varVStr: string;beginVStr := Copy(Alguem, AlgumaPos, AlgumTamanho);ChamaDll(PChar(VStr));end;A string é alocada por Copy, guardada em VStr, é passado para ChamaDllcomo um PChar, e depois que volta da rotina ChamaDll é que é desalocadapelo compilador.> mas no meu caso eu não sei qual será o tamanho final da string, devo alocar um array dentro da função> e liberar ele fora dela?Ou isso, ou usar ansi strings, ou usar StrAlloc, ou usar GetMem, ou usaralguma rotina que se preocupe com isto (exemplo strpcopy), etc. Elembrar de desalocar essa memória caso tenha sido alocada por você oupor alguma rotina que você chamou.Geralmente, ao programar com bibliotecas de link dinâmico, é comumutilizar ansi strings na aplicação e fazer um cast forçado na chamada àrotina. Todo o trabalho de alocação fica transparente pra você e vocêtem mais tempo para se preocupar com coisas mais importantes.Joao Morais . _________________________________________________________________ Conheça o Windows Live Spaces, a rede de relacionamentos do Messenger! http://www.amigosdomessenger.com.br/ [As partes desta mensagem que não continham texto foram removidas]