2016-08-14 3 views
0

Delphi 2010 RIDL 편집기에서 함수/프로 시저 포인터 유형의 특성을 인터페이스 정의에 정의 할 수 있는지 궁금합니다. 예를 들어 인스턴스를 작성할 때 구현 자의 CoCreator를 사용하여 해당 소스에 해당 인터페이스 정의를 사용하는 함수/프로 시저를 할당 할 수 있습니다. 사실 "???"을 채우는 방법을 알고 싶습니다.Delphi 2010 RIDL 편집기에서 함수/프로 시저 포인터 유형의 특성 정의

TLB 파일 :

IComIntf = interface(IDispatch) 
... 
    function Get_OnDoSomething : ??? safecall; 
    procedure Set_OnDoSomething(const New_Event : ???); safecall; 
... 
    property OnDoSomething : ???; 
... 
implementation 

uses ComObj; 

class function CoComIntf.Create: IComInt; 
... 
begin 
    Result := CreateComObject(CLASS_ComIntf) as IComIntf; 
end; 

구현 파일, ComIntfUnit.pas :

type 
    TOnDoSomething = function (Info: OleVariant): HResult of object; 

TComIntf = class(TAutoObject, IComIntf) 
private 
    fOnDoSomething : TDoSomething; 
... 
public 
    property OnDoSomething: TOnDoSomething read fOnDoSomething write fOnDoSomething; 
... 

클라이언트 형태 :

uses ComIntfUnit; 

type 
    TForm1 = class(TForm) 
    private 
    { Private declarations } 
    fCom : IComIntf; 
    function DoSomething(Info: OleVariant): HResult; 
    public 
    { Public declarations } 
... 
    end; 
... 

implementation 

{$R *.dfm} 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    fCom := CoComIntf.Create; 
    fCom.OnDoSomething := DoSomething; 
... 

미리 감사드립니다.

답변

1

원시 함수 포인터는 COM 호환 유형이 아닙니다. 원한다면 확실히 무효 포인터를 사용할 수 있지만 COM의 정신이 아닐 것입니다.

여기서해야 할 일은 다른 인터페이스를 전달하는 것입니다. 그러면 피 호출자는 해당 인터페이스에서 함수를 호출하고 호출자의 코드를 실행할 수 있습니다.

+0

안녕하세요, David, 귀하의 회신에 감사드립니다. 그렇다면 클라이언트 프로그램의 할당은 어떻게됩니까? 더 자세히 설명해주십시오. fCom.OnDoSomething : = DoSomething; – Zonouzi

+0

할 수 없습니다. 디스패치를 ​​지원하는 인터페이스가 아닙니다. 함수 포인터는 사용할 수 없습니다. ridl 편집장이 허용하지 않는 이유가 있습니다. 대신 인터페이스를 사용하십시오. –

0

잘못된 방향으로 가고 있습니다. 이것을 구현하는 올바른 방법은 클라이언트가 구현하고 COM 객체에 전달하는 두 번째 인터페이스를 정의하는 것입니다. 그런 다음 COM 개체는 해당 인터페이스를 유지하고 필요할 때 메서드를 호출 할 수 있습니다. 이것은 가장 일반적으로 이벤트 인터페이스 용으로 Connection Points을 사용하여 구현됩니다.

IDispatch를 사용하고, 특히 이후이를 구현하는 쉬운 방법은 IDE 마법사를 사용하여 새 자동화 개체을 만들고, 마법사 대화 상자에서 "이벤트 지원 코드를 생성"체크 박스를 클릭해야하는 것입니다 . 그런 다음 마법사는 개체 자체에 대한 인터페이스와 개체 이벤트에 대한 인터페이스를 생성하고 연결 지점 논리를 구현합니다. 그런 다음 필요할 때 객체 메서드가 이벤트 메서드를 호출하는 방식으로 필요에 따라 두 개의 인터페이스에 메서드를 추가 할 수 있습니다.

최종 개체를 컴파일하고 등록한 다음 IDE로 가져오고 해당 개체에 대한 VCL 래퍼를 생성하면 결과 구성 요소에는 내부적으로 개체의 연결 지점 이벤트에 연결되는 VCL 스타일의 이벤트가 생깁니다.

+0

안녕하세요 레미, 귀하의 방법은 내가 묻는 방식으로 IComIntf 정의를 사용하게됩니다 궁금입니다. David Heffernan이 말한 것으로부터 알 수 있듯이, 그것은 불가능합니다. 실제로 저는 인터페이스를 구현 한 클래스를 사용하여이를 구현했으며 클라이언트가 프로 시저 포인터 할당과 VCL 래퍼 메서드를 정의하고 할당 할 수 있도록 전용 멤버 및 관련 공개 또는 게시 된 속성의 정의를 추가했습니다. 내부적으로이 클래스에서는 IEvent를 만들고 InterfaceConnect/Disconnect를 사용했습니다. 내가 관심을 가지는 방식은 인터페이스 정의 자체를 사용하는 것이었다. – Zonouzi