如果這是一個微不足道的問題,我開始更加熟悉接口如何工作。如何找出對象是否支持給定的接口(兩個DLL之間)
我有兩個插件(稱爲他們A和B)的形式的DLL(不包)。在加載DLL的應用程序中聲明瞭一個GUID接口,將其稱爲IMyInterface。兩個插件都使用相同的GUID查看相同的接口定義。插件B實際上實現了該接口。
插件A想知道插件B是否支持接口IMyInterface。我用obj.GetInterface(IMyInterface的,IObj)發現了這一點:
如果我插件B內部調用此代碼,答案是肯定的,這是符合市場預期。如果我在插件A中使用相同的代碼(剪切和粘貼),則相同的代碼聲明插件B不支持該接口。當我將GetInterface調用追蹤到system.pas中時,我發現InterfaceEntry:= GetInterfaceEntry(IID);返回零,因此沒有界面來查找。
僅供參考,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邊界查詢接口是否存在問題?
我很高興地報告,ain和Heffernan給出的答案提供瞭解決問題的必要信息。我停止了傳遞對象,而是在插件之間傳遞IInterface,然後我使用supports方法來找出實際支持哪些接口並且工作。我現在可以將插件分類爲他們據說可以做的事情。非常感謝您的幫助。正確的答案是赫弗南,因爲他給出了更全面的答案,但基本上都是正確的。 – rhody