Francesco Perrotti wrote:
> 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?

Você não pode alocar memória em um executável e liberar em outro, a 
menos que os dois estejam usando exatamente o mesmo gerenciador de 
memória. Funcionava antes justamente por causa disto. Se a sua dll e o 
seu aplicativo são escritos com o mesmo compilador, você pode abrir a 
unit sharemem e criar uma dependência com a borlandmm.dll, isto resolve 
o seu problema e você sequer precisa trabalhar com pchar. Veja nos docs 
como o fastmm trabalha com o sharemem.

Agora se você quiser alguma independência, seja da unit sharemem ou da 
borlandmm.dll para poder usar sua dll com aplicativos escrito por 
terceiros, você tem que sempre desacolar memória através do mesmo 
executável que a alocou.

Para passagens de string, você abre um tanto de memória na aplicação, 
por exemplo, 256 bytes, e passar o seu pchar como parâmetro. Talvez você 
possa fazer isso aqui:

var
   VStr: string;
begin
   SetLength(VStr, 256);
   ChamaDll(PChar(VStr));
   UsaStr(VStr);
end;

Talvez você tenha problema com a identificação do tamanho da string, não 
sei, tem que testar a posição do #0 com o resultado de Length(VStr). 
Basta saber que ansi strings são totalmente compatíveis com pchar, mas a 
recíproca *não* é verdadeira.

Do outro lado, a dll sabe que esse pchar aponta para 256 bytes 
previamente alocados e coloca a string lá dentro. Depois você recebe a 
string populada pela dll e libera quando quiser. Dá um trabalho a la C, 
mas é a forma de fazer isto funcionar corretamente.

Joao Morais

Responder a