Безопасно ли использовать интерфейсы из dll - PullRequest
4 голосов
/ 13 января 2012

Когда я хочу экспортировать класс в DLL, это правильный подход, чтобы извлечь его из интерфейса и вернуть этот интерфейс с помощью экспортированной функции?

//exported dll function, which is used in the exe.
function MyClass_Create: IMyClass;
begin
  result := TMyClass.Create;
end;

А как насчет управления памятью? Могу ли я передавать / выводить различные интерфейсы и строки без проблем и сбоев?

IMyClass = interface
  procedure SetString(aMsg: string);
  function GetString: string;

  procedure SetClass(aClass: ITestClass);
  function GetClass: ITestClass;
end;

Ответы [ 2 ]

5 голосов
/ 13 января 2012

Ссылки на интерфейсы ортогональны управлению памятью.Обычно вы экспортируете функцию, которая возвращает интерфейсную ссылку из dll, и не заботитесь об управлении памятью.С интерфейсами подсчета ссылок вы можете быть уверены, что экземпляр объекта, который реализует интерфейс, будет также освобожден в dll.

Строки отличаются.Не имеет значения, экспортируете ли вы интерфейс или экспортируете плоские функции - применяются те же ограничения.

Кстати, заголовок вашего вопроса неверен, в Delphi нет «экземпляров интерфейса».

3 голосов
/ 13 января 2012

Использование таких интерфейсов гарантирует, что объект, реализующий интерфейс, будет создан и освобожден в той же куче.

Однако это не решит проблему размещения и освобождения динамических типов строк в разных кучах.Есть много возможных решений для этого, но, на мой взгляд, наилучшим подходом является использование WideString через границу модуля.

Тип WideString является оболочкой вокруг COM BSTR и размещается в общей куче COM.Вам нужно только использовать WideString для интерфейса.Внутренние компоненты реализующих классов могут использовать собственные строки Delphi.

Как строки представляют проблемы, так и динамические массивы.Попытка передачи динамических массивов через границы модуля небезопасна.Не существует решения, аналогичного WideString, которое было бы настолько удобным.Вы можете использовать вариантные массивы, но это довольно неуклюже по сравнению с WideString.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...