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]

Responder a