Delphi's Sharemem - когда это не нужно - PullRequest
9 голосов
/ 07 декабря 2011

Я знаю, что когда я делю strings между приложением Delphi и DLL-библиотекой Delphi, мне нужно добавить Sharemem как в приложение, так и в источник проекта dll в качестве первого модуля в предложении использования.

Но если функция экспорта dll, которая принимает только Pchars, но внутри некоторых методов dll, которые я использую strings, должна ли я также использовать sharemem? Позвольте мне показать пример кода:

procedure ShowMyCustomMessage(aMessage : Pchar);
var
  vUselessString : string;
begin
  vUselessString := aMessage;
  ShowMessage(vUselessString);
end;

exports
  ShowMyCustomMessage;

В этом простом и бесполезном случае, dll принимает Pchar, но внутри экспортированного метода dll создает string var. Должен ли я также добавить ShareMem?

А как насчет WideString? Требуется ли для передачи WideString параметров Sharemem?

1 Ответ

17 голосов
/ 07 декабря 2011

Вам необходимо использовать Sharemem тогда и только тогда, когда память выделена в одном модуле (то есть DLL / EXE) и освобождена в другом модуле.Это обычно происходит, когда вы работаете, передавая string между модулями.

В приведенном вами примере нет необходимости использовать Sharemem.Память для PChar выделяется вызываемым и не освобождается вызываемым абонентом.Строка в вызываемом объекте выделяется и освобождается в вызываемом объекте.

Вот пример, где вам потребуется Sharemem:

function GetString: string;
begin
  Result := 'hello';
end;

Здесь память для строки выделяется в вызываемом объекте, нобыть освобожденным вызывающей стороной.

Случай WideString является совершенно особенным.WideString - это оболочка для типа COM BSTR.Он выделяет и освобождает, используя общий распределитель COM.Поэтому он не использует распределитель Delphi, и вы можете безопасно передавать WideString между модулями без использования Sharemem.

...