2011-10-24 64 views
0

我已經在C++應用程序中使用的C++中創建了COM服務器。現在我必須向COM對象添加一個方法,其中一個參數必須是指向回調函數的函數指針。 C++原始功能如下所示:函數指針作爲COM方法的參數

typedef int (__stdcall *tCallBackFunc)(int Param); 

void MyFunc(void* CallBackFunc) 
{ 
    int Param; 
    //some code 
    ((tCallBackFunc)(CallBackFunc))(Param); //call callback function 
} 

我需要添加MyFunc作爲COM對象的方法。 VS VC++「添加方法」對話框爲COM方法參數提供了一些預定義類型,例如「int *」或「bstr」,我嘗試將「CallBackFunc」參數定義爲「int *」類型,但是我無法使其工作C#:

public delegate int tCallBackFunc(int Param); 
... 
tCallBackFunc cb; //I will initialize it when it is compiled 
MyCOMObject.MyFunc(cb); //cannot find any way to cast cb to "ref int" 

看來,我用錯誤的做法,有沒有聲明函數指針在C++ COM對象方法的參數,然後在C#中使用它的快捷方式?

回答

7

COM方法是使參數成爲接口指針,並使接口聲明回調函數。

+0

聽起來不是一個簡單的解決方案,我將不得不創建一個接口,然後在C#中使用它。我尋找最快的方法,我找到了一些如何在C#中使用EnumWindows API的文章(它需要回調函數),如果可能的話,使用相同的方法也可以,但我無法通過[聲明](重新聲明)COM方法[ DllImport] – Mike

1

+1對於Frederik的回答。

@Michael:它會比你想象中的解決方案容易得多。 特別是隨着

  • 對象生存
  • 進程邊界
  • 線程安全(公寓邊界,IOW)
  • 標準的一致性(鑄造函數指針快進未定義行爲的結構域)。 爲什麼你應該擔心?標準一致性必須關注你的情況下,編譯器更新引入了另一種優化,使您的舊的(不符合標準)代碼休息
+0

好的,你可以給我一些鏈接,演示如何在C++中創建接口來支持回調,然後從C#中使用它?我Google搜索,但沒有找到好的文章,可能是我使用了錯誤的關鍵詞,因爲我不知道我需要什麼來使用您推薦的解決方案。恐怕會花費很多時間,如果是這樣,我將通過[DllImport]而不是COM來使用我的C++ DLL。 – Mike

+0

我沒有示例,但它很簡單:它只是一個COM接口(以另一種方式_:將它傳遞給'服務器'來調用_you_)。它與源接口(IDL/COM術語)非常相似,它可能會幫助您搜索相關示例。 (但是在實踐中使用回調接口比實際的COM源接口更簡單; COM技術實際上只有在從諸如VB之類的語言中消耗它們時纔有助於添加「語法糖」,因爲它們將作爲常規事件公開。順便提一下, – sehe

+0

我會從這裏開始:http://msdn.microsoft.com/en-us/library/1hee64c7.aspx C#似乎很好地包裝和處理連接點機制 –