2010-05-10 4 views
1

Delphi에서 클래스 참조를 전달하여 객체 유형을 비교하고 인스턴스화 할 수 있습니다. COM 자동화 서버에 전달되는 인터페이스 참조를 사용하여 동일한 작업을 수행 할 수 있습니까? 내가 노드 종류, 예를 들어,에 의해 지정된 인터페이스를 지원하는 자동화 형태를 돌려하고자하는이 기능에서델파이의 자동화 메소드에 인터페이스 유형/GUID 참조를 전달하는 방법

function ChildNodesOfType(NodeType: TGUID): IMBNode; safecall; 

:

예를 들어, 형식 라이브러리 편집기를 사용하여 GUID 매개 변수를 복용하는 방법을 정의 할 수 있습니다

if Supports(SomeNode, NodeType) then 
     result := SomeNode; 

하지만 지지대는 항상 내가 형식 라이브러리에 정의 된 GUID를 전달 시도 실패하지만, 다른 유형 (Ixxx, Class_xxxx, IId_Ixxxx) 중 어느 것도 제대로 작동하지 호출합니다.

답변

4

SysUtils를 단위는 Supports의 적어도 다섯 과부하와 함께 제공, 그들은 모두 자신의 두 번째 매개 변수에 대한 TGUID 값을 받아들입니다.

실제로 매개 변수로 인터페이스 유형을 전달할 수 있지만 실제로는 GUID입니다. 즉, 함수가 TGUID 인수를 예상하면 IMBNode 또는 IUnknown과 같은 인터페이스 유형 식별자를 전달할 수 있습니다.

type 
    IMBNode = interface 
    ['{GUID-goes-here}'] 
    // methods and properties 
    end; 

Supports 내지 제 파라미터 인터페이스 기준이 함수는 QueryInterface 메소드 호출이 작동하기 위해서는, 비록 인터페이스 유형이 같은 선언에 GUID를 포함 할 필요가있다. S_OK을 반환하면 Supports이 true를 반환합니다. 그렇지 않으면 false를 반환합니다. 첫 번째 매개 변수가 개체 참조 인 경우 먼저 개체의 GetInterface 메서드를 호출하여 IUnknown 인터페이스를 가져오고 전에와 마찬가지로 Supports을 호출합니다. 그런 식으로 작동하지 않으면 요청한 인터페이스를 직접 묻는 질문으로 돌아갑니다. GetInterface. 객체에 QueryInterface을 올바르게 구현했거나 TInterfacedObject의 기본 구현을 사용한 경우 모든 것이 잘 작동합니다.

Supports이 결코 사실을 반환하지 않으면 몇 가지 가정을 다시 고찰해야합니다. 노드가 요청한 인터페이스를 실제로 지원합니까? 클래스 선언에 해당 인터페이스가 포함되어 있는지 확인하십시오. QueryInterface이 올바르게 구현되었는지 확인하십시오. SomeNode이 실제로 원하는 노드를 참조하는지 확인하십시오.

+0

안녕하세요 롭, 고맙습니다. 훌륭한 답변입니다. TInterfacedObject를 사용하지 않아도 작동하지 않아야 할 이유는 없습니다. 따라서 필자의 가정을 확인한 결과 실수로 인터페이스를 구현하지 않는 지원 객체로 실수로 객체를 전달한 결과였습니다. –

관련 문제