Я только начинаю знакомиться с тем, как работают интерфейсы, так что терпите меня, если это тривиальный вопрос.
У меня есть два плагина (назовите их A и B) в форме DLL (непакеты).В приложении есть интерфейс с GUID, который загружает DLL, назовите его IMyInterface.Оба плагина видят одно и то же определение интерфейса с одинаковым GUID.Плагин B фактически реализует интерфейс.
Плагин A хочет выяснить, поддерживает ли плагин B интерфейс IMyInterface.Я использую obj.GetInterface (IMyInterface, IObj), чтобы выяснить это:
var IObj : IMyInterface;
obj : TObject;
obj := getPluginObjReference;
if obj.GetInterface(IMyInterface, IObj) then
showmessage ('Interface Supported');
Если я назову этот код в плагине B, ответ будет положительным, как и ожидалось.Если я использую тот же код (вырезать и вставить) в плагине A, тот же код утверждает, что плагин B не поддерживает этот интерфейс.Когда я отслеживаю вызов GetInterface в system.pas, я нахожу, что InterfaceEntry: = GetInterfaceEntry (IID);вернуть nil, следовательно, нет интерфейса для поиска.
Для справки, IMyInterface выглядит так:
IMyInterface = interface
['{277A3122-A3F2-4A14-AE56-C99230F31CE9}']
function getModel : AnsiString;
function getDescription : AnsiString;
end;
, а реализация выглядит так:
// Now the real class, this is private to this plugin
TModelAPI = class (TInterfacedObject, IMyInterface)
function getModel : AnsiString;
function getDescription : AnsiString;
end;
и т. д.
Мой вопрос:
Как и ожидалось, плагин B справедливо заявляет, что IMyInterface поддерживается.Почему плагин A не может обнаружить, что плагин B поддерживает IMyInterface?Есть ли проблема с опросом интерфейсов через границы DLL?