2011-12-11 4 views
4

인터페이스가 작동하는 방식에 익숙해지기 시작 했으니까요.개체가 주어진 인터페이스 (두 DLL 사이)를 지원하는지 확인하는 방법

DLL (패키지 아님) 형태로 두 개의 플러그인 (A와 B라고 부름)이 있습니다. DLL을로드하는 응용 프로그램에 선언 된 GUID가있는 인터페이스가 있으며이 인터페이스를 IMyInterface라고합니다. 두 플러그인은 동일한 GUID를 가진 동일한 인터페이스 정의를 참조합니다. 플러그인 B는 실제로 인터페이스를 구현합니다.

플러그인 A는 플러그인 B가 인터페이스 IMyInterface를 지원하는지 확인하려고합니다. 나는이를 찾아 obj.GetInterface (IMyInterface, IObj)를 사용 :

내가 플러그인 B에서이 코드를 호출하는 경우, 대답은 예상대로되는 예이다. 플러그인 A에서 동일한 코드 (잘라 내기 및 붙여 넣기)를 사용하면 동일한 코드가 플러그인 B가 해당 인터페이스를 지원하지 않는다고 주장합니다. GetInterface 호출을 system.pas로 추적 할 때 InterfaceEntry : = GetInterfaceEntry (IID); nil을 반환하므로 찾을 인터페이스가 없습니다.

// Now the real class, this is private to this plugin 
TModelAPI = class (TInterfacedObject, IMyInterface) 
    function getModel : AnsiString; 
    function getDescription : AnsiString; 
end; 

내 질문 등 :

예상 플러그인 B가 바르게 주장

으로

IMyInterface = interface 
['{277A3122-A3F2-4A14-AE56-C99230F31CE9}'] 
    function getModel : AnsiString; 
    function getDescription : AnsiString; 
end; 

및 구현은 다음과 같습니다처럼 참고로

는 IMyInterface 보인다 IMyInterface가 지원됩니다. 플러그인 A가 플러그인 B가 IMyInterface를 지원한다는 것을 발견하지 못하는 이유는 무엇입니까? DLL 경계를 넘나들며 인터페이스를 조사하는 데 문제가 있습니까?

+1

나는 ain과 Heffernan이 주어진 대답이 문제를 해결하는 데 필요한 정보를 제공했다는 것을 기쁘게 생각합니다. 나는 객체를 전달하는 것을 멈추고 플러그 인간에 IInterface를 전달했다. 그런 다음 실제로 지원되는 인터페이스를 찾는데이 메소드를 사용했다. 플러그인을보고 할 수있는 것으로 분류 할 수 있습니다. 많은 도움을 주셔서 감사합니다. 올바른 대답은 Heffernan에게하겠습니다. 왜냐하면 그는 완전한 답을 주었지만 근본적으로 옳았습니다. – rhody

답변

7

DLL 경계를 넘어서 개체를 안정적으로 전달할 수 없습니다. 대신 경계를 넘어 인터페이스를 전달하고 기능을 쿼리하려면 as 또는 Supports을 사용해야합니다. 인터페이스는 DLL 경계에서 바이너리 호환성을 위해 설계되었지만 객체는 그렇지 않습니다.

한 DLL에서 다른 DLL로 쉽게 IInterface을 전달한 다음 쿼리 할 수 ​​있습니다. 또는 모든 플러그인 객체가 구현하는 공용 인터페이스가있는 경우이를 전달할 수 있습니다. 중요한 것은 항상 인터페이스를 전달하고 객체를 전달하지 않는 것입니다.

+2

"100 % 인터페이스 API"를 유지하면 DLL이 런타임 패키지 작업을 위해 컴파일하지 않고도 Delphi에서 작동 할뿐만 아니라 다양한 Delphi 버전간에, 심지어 Delphi로 작성된 DLL과 Delphi로 작성되지 않은 응용 프로그램간에도 작동합니다. 간단히 말해, Interfaces (COM)는 컴파일러의 릴리즈마다 또는 언어간에 변경되지 않는 사양 (Application Binary Interface)을 작성해야하기 때문에 존재합니다. –

6

getPluginObjReference은 모든 플러그인에서 지원하는 가장 낮은 공통 인터페이스를 반환해야하며 Supports() 함수를 사용하여 특정 플러그인이 지원하는 인터페이스 (플러그인 버전)를 테스트해야합니다.

관련 문제