程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> c#調用c++帶有回調函數方法的實現

c#調用c++帶有回調函數方法的實現

編輯:C#入門知識

在c++中有個回調函數指針的概念,只需要某個函數在調用定時器函數時傳入一個函數指針就能達到目的,但C#中沒有函數指針的概念,我們該怎樣來實現呢。
其實說到回調函數,大家應該能想到c#中的委托,雖然名字不一樣,但在各自的語言范疇都能實現相似的功能。所以我們就可以大膽的嘗試下,把c#中的委托傳給c++,看c++是否能夠承認它就是回調函數。

首先用c++寫一個帶有回調函數的方法 Test,在此省略。

接著,在c#中調用,如:

[DllImport("Test.dll",ChartSet.Ansi,EntryPoint="ReadMyVideo",ExactSpelling=false,CallingConvertion=CallingConvertion.StdCall)]

private static extern void Test(string fileName,CallbackDelegate callback);
接下來我們再定義一個委托:

public delegate void CallbackDelegate([marshalAs(UnmanagedType.LPArray,SizeConst=8010)]byte[] buffer,int count);

public static CallbackDelegate callback;
注:說明一下,在給c++傳入數組參數時,必須得用[marshalAs(UnmanagedType.LPArray,SizeConst=8010)] 處理一下,相當於是告訴c++,c#傳入的是一個長度為8010的數組類型,如果不寫這句話的話,你回調函數接收到的參數將只有一條數據。

接下來看看怎樣來調用:

在調用時,我們得先寫一個接受c++傳回參數的方法,即我們傳入委托的實現方法。

private void CallBackFunction([marshalAs(UnmanagedType.LPArray,SizeConst=8010)]byte[] buffer,int count)

{

...//處理c++傳過來的數據s

}
一切工作准備完畢之後,我們來進行最後一步操作把

public void GetData()

{

     callback=CallBackFunction;

    ReadMyVideo("",callback);

}
經過驗證,委托就是c++要的回調函數。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved