Код:
// DLL
procedure ProcStr(AIn : PChar; AOut : PChar);
begin
StrCopy(AIn, AOut);
end;
// Вызов
var
AIn, AOut : PChar;
begin
AIn := 'aaa';
GetMem(AOut,StrLen(AIn)+1);
ProcStr(AIn,AOut);
...
FreeMem(AOut, StrLen(AIn)+1);
end;
При этом AIn и AOut должны быть инициализированны в вызывающем коде. Если у тебя другая длинна выходной строки, то надо передавать внутрь размер буфера, а на выходе еще получать код возврата в виде размера требуемой памяти (как в WinAPI):
Код:
// DLL
function ProcStr(AIn : PChar; Buf : PChar; BufLen : Integer) : Integer;
begin
Resul := 0; // Success
If BufLen >= StrLen(AIn)
Then StrCopy(Ain, AOut)
Else Result := StrLen(AIn);
end;
// Вызов
var
AIn, AOut : PChar;
szLen : Integer;
begin
AIn := 'aaa';
szLen := 0;
Repeate
GetMem(AOut,szLen);
szLen := ProcStr(AIn, AOut, szLen);
Until szLen = 0;
...
FreeMem(AOut,szLen);
end;
Если все-таки хочется выделять память в DLL, то надо сделать специальнцю функцию в DLL, которая будет освобождать выделенну. в DLL память. Пример писать не буду, бо как просто - вызов FreeMem переноситься в DLL.