Показать сообщение отдельно
  #2  
Старый 11.08.2010, 03:55
lmikle lmikle сейчас на форуме
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,111
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Код:
// 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.
Ответить с цитированием