1

Mobile Broadband APIのドキュメントには、次のように書かれています。

次の手順では、通知を登録する方法について説明します。

1. IMbnInterfaceManager > オブジェクトで QueryInterface を呼び出して、IConnectionPointContainer インターフェイスを取得します。
2.返されたインターフェイスで FindConnectionPoint を呼び出し、IID_IMbnPinEvents を riid に渡します。
3. 返された接続ポイントで Advise を呼び出し、IMbnPinEvents を pUnk に実装する > オブジェクト上の IUnknown インターフェイスへのポインターを渡します。

通知は、手順 2 で返された接続ポイントで Unadvise を呼び出すことによって終了できます。

最初の 3 つの手順を実行するコードがいくつかあり、MBN イベントに正常に登録されます。ただし、これらのイベントの受信から一時的に登録を解除する必要があります。
そのため、COM 例外で終了した最初の試行を 2 回行った後、次のコードを試しました (try/catch ブロックを使用)。

//First get the notifications

public void RegisterEvent(object iUnk, Guid guid, out uint storedTag)
{
IConnectionPoint icp = null;
Guid curGuid = guid;
storedTag = 0;
if ((curGuid == typeof(IMbnInterfaceManagerEvents).GUID) )              
{
  // For this event, the connection point is defined on the interface manager object
  m_InterfaceManagerCPC.FindConnectionPoint(ref curGuid, out icp);
  // Call Advise on the connection point to register
  icp.Advise(iUnk, out storedTag);
  //Save the IConnectionPoint object
  interfaceManagerCP = icp;

}

//Now deregister the events

public void DeregisterEvent(Guid guid, uint storedTag)
{
IConnectionPoint icp = null;
Guid curGuid = guid;

// Find the appropriate connection point to call Unadvise on
if ((curGuid == typeof(IMbnInterfaceManagerEvents).GUID) )              
{
  // Call Unadvise on the saved connection point to de-register
  interfaceManagerCP.Unadvise(storedTag);
}

このコードを実行すると、MBN からエラーや例外が発生しません。ただし、イベント ハンドラーは登録解除されません。ログ ファイルで、MBN イベントが到着して処理されていることを確認できます。

私が欠けているものを誰か教えてもらえますか?ありがとうございました。

4

1 に答える 1

0

私は問題を理解したと思います。さまざまな種類の GUID があり、それらはすべて同じ IConnectionPoint を使用していると思ったので、RegisterEvent 関数の同じオブジェクトに保存しました。

GUID ごとに新しい IConnectionPoint オブジェクトを作成し、各 IConnectionPoint を個別に保存しようとしたところ、DeregisterEvent 関数も正常に機能しました。

于 2013-05-02T13:50:12.043 に答える