2012-03-04 6 views
0

comのdllファイルをdelphiにインポートした後、delphiはlib_tlb.pasファイルを生成しました。comコンポーネントのdelphi tlb_libファイルは、インタフェースとオブジェクトの間に接続していません

はファイルを検査それはTinterface1とIinterface1間の接続がないことを確認するために

Iinterface1 = interface(IDispatch) 
    function func: Integer; safecall; 
    procedure proc(param:Iinterface1); 
end; 

Cointerface1 = class 
    class function Create: Iinterface; 
    class function CreateRemote(const MachineName: string): Iinterface1; 
end; 

Tinterface1 = class(TOleServer) 
    function func: Integer; 
    procedure proc(param:Iinterface1); 
end; 

今その明確示しています。

問題は、Tinterface1でprocを呼び出すときに発生します。これはコンパイルされませんTinterface1はIinterface1を継承しません。

どうすればよいですか?自動生成されたlibを変更しますか?または、Tinterface1をprocに渡したいときに、何をすべきかという良いアイデアがありますか?

この例ではコードを簡略化していますが、コードにはprocに渡す必要があるantherオブジェクトがありますが、procはそのインターフェイスだけを認識します。これは同じ問題です。

更新:それは、COM DLLファイルの手動だとして、procは、インターフェイスが専用のビューのデルファイポイントである

procedure proc(param:^Tinterface1); 

べきであると述べています。

+1

実際のコードを投稿する必要があります。 typelibビューアでtypelibを見たことがありますか?ファイルは何を表示すべきですか? –

+0

特定のタイプのlibビューアをお勧めしますか?それは私のものではなく、独自のコードです。 – none

+0

Delphiに付属しているtypelibraryビューアを使用するだけで、構造がどのようなものであるべきかがわかります。そのデルファイIDEがtlb pasを間違って生成している可能性はありません。 –

答えて

3

TInterface1.Proc()は、既存のIInterface1オブジェクトが入力として渡されることを想定しています。例えば、そのオブジェクトを作成するためにCointerface1.Create()を使用します。

var 
    intf: Iinterface1; 
begin 
    intf := Cointerface1.Create; 
    TheOleServerInstance.proc(intf); 
end; 

Tinterface1が直接Iinterface1から継承しません(それは内部的にIinterface1を包むん)TOleServer子孫であるので、あなたは、あなたがそれを渡したい時はいつでもそれをキャストする必要がありIinterface1が必要です。例:

var 
    intf: Iinterface1; 
    svr: Iinterface1; 
begin 
    intf := Cointerface1.Create; 
    if Supports(TheOleServerInstance, Iinterface1, svr) then 
    intf.proc(svr); 
end; 
+0

はい、オブジェクトはcointertercae1.createで作成され、これはTinterfacceを受け入れることができないIinterfaceを作成します。なぜ私は、Delphiが一度も使用されていないのであれば、Tinterfaceを作成するのはどうですか? – none

+1

これを読む:http://docwiki.embarcadero.com/RADStudio/en/Code_Generated_When_You_Import_Type_Library_Information –

関連する問題