Fórum Quando é necessário usar Sharemem em DLL? #333635

24/11/2006

0

Como não consegui fazer o firebird funcionar com arrays, estou pensando em criar uma UDF para fazer a operação. Resolvi aproveitar uma UDF que já tenho com duas funções. Só que aí fui reparar que minha UDF atualmente exporta uma função cujo resultado é um pchar. Quando inicio um novo projeto de DLL aparece escrito que qualquer dll que retorne strings deve usar a unit ShareMem para fazer com que a dll use a BORLNDMM.DLL. Minha dúvida é se no meu caso (exportando pchar) eu também tenho que usar essa unit. O que pode acontecer quando se usa uma dll que retorne string e não use ShareMem? As strings ficam em memória sem ser liberadas? E no texto também fala que no meu projeto eu também tenho que declarar essa unit. O que pode acontecer se eu definir ShareMem na DLL, mas não colocar no meu projeto? O meu projeto e a dll passariam a usar gerenciadores de memória diferentes, certo? O que isso acarretaria?

grato pela ajuda.


Djorius

Djorius

Responder

Posts

26/11/2006

Massuda

Minha dúvida é se no meu caso (exportando pchar) eu também tenho que usar essa unit. O que pode acontecer quando se usa uma dll que retorne string e não use ShareMem? As strings ficam em memória sem ser liberadas?
Como retorna PChar, a princípio não precisa do ShareMem, mas para isso funcionar corretamente, o buffer apontado pelo PChar deve ser alocado estaticamente (ou seja, é um array declarado como var ou const) ou alocado dinamicamente; não é boa idéia retornar um PChar para uma string.

strings em Delphi são um tipo de variável alocada dinamicamente (exceto ShortString e strings com tamanho fixo) que tem o recurso adicional de ter internamente uma contagem de referencias. Cada vez que a string é atribuída a uma variável essa contagem interna da string aumenta; cada vez que a variável deixa de existir, a contagem interna diminui e, se atingir zero, a memória usada pela string será liberada. Por causa dessas características, não é boa idéia usar string como tipo de parametro ou de retorno em funções/procedures que serão usadas por outros programas possivelmente escritos em outra linguagem que não Delphi.

E no texto também fala que no meu projeto eu também tenho que declarar essa unit. O que pode acontecer se eu definir ShareMem na DLL, mas não colocar no meu projeto? O meu projeto e a dll passariam a usar gerenciadores de memória diferentes, certo?
O gerenciador de memoria do Delphi se encarrega de pedir blocos de memória para o Windows na medida que for necessário. Cada vez que um objeto, string ou qualquer tipo de variável alocada dinamicamente é criada, seu programa pede memória ao gerenciador do Delphi.

Não é difícil perceber que, com dois gerenciadores de memória, um do programa e outro da DLL, as coisas não vão funcionar direito.

O ShareMem sendo usado tanto pelo programa como pela DLL faz com que o gerenciador seja um só, implementado em BorlandMM.DLL.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar