Originariamente inviato da colde
Devo creare una nuova variabile pointer in cui inserire l'inidirzzo di Result per passarlo alla DLL che me lo dealloca? Oppure, se faccio in questo modo è la stessa cosa?
TextReturn := Polling(PChar('PIPPO'));
Memo1.Lines.Add(TextReturn);
FreeMem(TextReturn);
In questo modo è perfetto. L'uso di una funzione apposita nella DLL che fa questo mestiere avrebbe solamente lo scopo di rendere la cosa più elegante (per evitare la chiamata a FreeMem che potrebbe risultare meno intuitiva, da parte di terzi, rispetto all'uso di una funzione apposita della DLL che fa solo quello).

Originariamente inviato da colde
Però in questo modo dealloco TextReturn, non la variabile Result della funzione e dato che ho allocato memoria a Result e non a TextReturn, ho una vaga sensazione che questo non vada bene. Confermi?
Tu non deallochi le variabili, a quello ci pensa già il codice inserito nel compilatore (infatti, non hai mai dovuto scrivere codice per "distruggere" variabili intere e simili).

Quello che deallochi con FreeMem è il buffer puntato dalla variabile.

Result è solo un segnaposto per il valore di ritorno della funzione; quando essa termina, il valore viene assegnato (o perduto) alla variabile preposta. Nel caso in esame, viene restituito un puntatore, Result esce dallo "scope" e quindi viene deallocata la memoria riservata al contenimento del puntatore, il cui valore passa alla variabile che ottiene il ritorno dalla funzione, che utilizza quel puntatore e, successivamente, lo passa ad un'altra procedura che lo usa per risalire al buffer da allocare.

Confondi il rilascio della memoria delle variabili con il rilascio della memoria allocata con GetMem; nelle prime ci sono solo i riferimenti (puntatori) al buffer creato con GetMem; con FreeMem, usando il puntatore, distruggi il buffer.
Le variabili che contengono il puntatore, che non è altro che un valore intero, sono gestite in automatico, come sempre.

Ciao!