0

COM を介してアプリケーションの特定の部分にアクセスしようとしています。主な理由は、Delphi アプリケーションが .NET アプリケーションで特定のサービスを呼び出せるようにする必要があるためです。

ServicedComponent クラスから継承する COM を介していくつかのメソッドを公開し、正常に動作するようにしました。

ここで、特定のことが発生したときにクライアントに警告できるように、クライアントにイベントを発生させる必要があります。現在、次のようなものがあります。

public interface IEvents
{
  void OnMessage();
}

[EventClass]    
[ComVisible(true)]
public class MyEventsClass : ServicedComponent, IEvents
{
  public void OnMessage()
  {
  }
}

しかし、Delphi から TypeLibrary をインポートすると、次のようになります。

IEvents = interface(IDispatch)
    ['{E7605303-F968-3509-829B-BF70084053C4}']
    procedure OnMessage; safecall;
  end;

IEventsDisp = dispinterface
    ['{E7605303-F968-3509-829B-BF70084053C4}']
    procedure OnMessage; dispid 1610743808;
  end;

使い方がよくわからないもの。MyService.Register(IEvents events) を介して実装してサービスに提供できる IUnknown インターフェイスを期待していました...

私はここで完全に迷っていると思います... .NET で COM+ イベントを適切に実装する方法についてのアドバイスや参照はありますか?

4

1 に答える 1

1

EventClass を使用する必要がないことを発見したため、正確に EventClass を使用することはまだわかりません。私は単にこれを宣言しました:

[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IMyEventIface
{
}

そして、インターフェイスは IUnknown インターフェイスとして Delphi にエクスポートされます。

次に、次のような接続シグネチャを持つ ServicedComponent クラスのメソッドを定義します。

public void Connect(IMyEventIface eventHandler)
{
  mEvents.Add(eventHandler);
}

各クライアントイベントハンドラーの呼び出しを手動で処理する必要がありましたが、私が見つけた唯一の方法です。

于 2009-06-10T14:04:14.580 に答える