簡體   English   中英

在C ++中注冊.NET COM事件的處理程序

[英]Registering handlers for .NET COM event in C++

我一直在關注如何通過COM公開.NET框架的'教程'( http://msdn.microsoft.com/en-us/library/zsfww439.aspxhttp://msdn.microsoft.com/ en-us / library / bd9cdfyx.aspx )。 除了活動部分,一切都有效。 當我向C#接口添加事件時,會生成以下C ++代碼:

struct __declspec(uuid("..."))
_MessageEventHandler : IDispatch
{};

struct __declspec(uuid("..."))
IConnection : IDispatch
{
  virtual HRESULT __stdcall add_MessageEvent (
    /*[in]*/ struct _MessageEventHandler * value ) = 0;
  virtual HRESULT __stdcall remove_MessageEvent (
    /*[in]*/ struct _MessageEventHandler * value ) = 0;
}

問題是我沒有找到任何關於如何在C ++中使用它的信息。 我是否需要從_MessageEventHandler派生並實現operator() 或完全不同的東西?

(請注意,目前我還在嘗試使用IConnectionPointContainer和IConnectionPoint的更多文檔化方法。)

自從我使用COM以來,已經很長時間了,當時我使用的是Visual C ++ 6.0。 我記得為COM連接點實現接收器並不是一個簡單的過程。 有多種方法可以實現它們,具體取決於您是否使用過MFC或ATL。 也許現在有更簡單的方法。 以下是幾個可以幫助您的鏈接:

代碼項目 - 在非托管C ++中從托管代碼中下沉事件
代碼項目 - COM - 關於COM的大量文章
代碼項目 - 處理控制台應用程序中的COM事件
代碼項目 - 在控制台應用程序中處理COM事件,第二部分

IDispatch用於VB之類的運行時綁定語言,對於像c#這樣的強類型語言,通常不需要這樣做。

當您通過IDispatch調用方法時,您實際做的是構建一個包含方法id(稱為dispid)和參數的數組,然后將其交給一個函數,該函數通過dispid搜索方法表,當它找到一個時,它使用您的參數數組構建一個callstack,然后調用該方法。 (當然,這是過於簡單化)。

所以知道一個類實現IDispatch幾乎沒有任何東西。

所以這是以太假導致的錯誤,或者您缺少MessageEventHandler調度表的聲明。

你無法弄清楚如何實現這一點並不奇怪,你缺少一些重要的信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM