인터페이스가 작동하는 방식에 익숙해지기 시작 했으니까요.개체가 주어진 인터페이스 (두 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 경계를 넘나들며 인터페이스를 조사하는 데 문제가 있습니까?
나는 ain과 Heffernan이 주어진 대답이 문제를 해결하는 데 필요한 정보를 제공했다는 것을 기쁘게 생각합니다. 나는 객체를 전달하는 것을 멈추고 플러그 인간에 IInterface를 전달했다. 그런 다음 실제로 지원되는 인터페이스를 찾는데이 메소드를 사용했다. 플러그인을보고 할 수있는 것으로 분류 할 수 있습니다. 많은 도움을 주셔서 감사합니다. 올바른 대답은 Heffernan에게하겠습니다. 왜냐하면 그는 완전한 답을 주었지만 근본적으로 옳았습니다. – rhody