日期:2014-05-17  浏览次数:21173 次

C# 调用VC++写的dll 回调机制如何实现 江湖救急
大家好,我用的是VS2010 C#,dll以前没有调过,现在我要调一个c++写的dll,项目是上位机与下位机通信方面的,dll基本上要实现的功能就是:1.我将部分数据传给dll,dll解析并显示数据。2.dll回调我的C#主程序,将dll要发给下位机的命令数据传给C#主程序,C#主程序发给下位机。目前,功能1已经实现,到了功能2,由于搞不懂C#中dll的回调机制是如何实现的,查了好多资料,也没能解决问题,望大家帮忙,先行谢过。最好是带上实例。
我功能1的代码
C# code
 
       [DllImport("StaticDll.dll", CharSet = CharSet.Ansi, EntryPoint = "CreateDlgEx", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        public static extern int CreateDlgEx(int na);
                [DllImport("StaticDll.dll", CharSet = CharSet.Ansi, EntryPoint = "AcceptDataEx", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        public static extern int AcceptDataEx(byte[] sBuf, int nLen, int nType);


现在功能2 想提供一个带有两个参数的 回调函数 参数1 byte[] btData,参数2 int nLen,供DLL调用,请指点

------解决方案--------------------
非托管回调示例
C# code

[DllImport("user32")] 

public static extern int EnumWindows(CallBack x, int y); 

3.最后实例化委托,调用 EnumWindows。 

CallBack myCallBack = new CallBack(EnumWindowsApp.Report); 

4.完全代码如下: 

using System; 

using System.Runtime.InteropServices; 

public delegate bool CallBack(int hwnd, int lParam); 

public class EnumWindowsApp 

{ 

[DllImport("user32")] 

public static extern int EnumWindows(CallBack x, int y); 

public static void Main() 

{ 

CallBack myCallBack = new CallBack(EnumWindowsApp.Report); 

EnumWindows(myCallBack, 0); 

} 

public static bool Report(int hwnd, int lParam) 

{ 

Console.Write("Window handle is :"); 

Console.WriteLine(hwnd); 

return true; 

} 

}

------解决方案--------------------
回调函数是托管应用程序中可帮助非托管 DLL 函数完成任务的代码。对回调函数的调用将从托管应用程序中,通过一个 DLL 函数,间接地传递给托管实现。在用平台调用调用的多种 DLL 函数中,有些函数要求正确地运行托管代码中的回调函数。

开始实现之前,先查看 EnumWindows 函数的签名。EnumWindows 具有以下签名: 

复制代码 
BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)
 

表示此函数需要回调的线索之一是存在 lpEnumFunc 参数。如果参数采用指向回调函数的指针,其名称中通常会有 lp(长指针)前缀与 Func 后缀的组合。有关 Win32 函数的文档,请参见 Microsoft Platform SDK。 

创建托管回调函数。该示例声明一个名为 CallBack 的委托类型,此委托类型采用两个参数:hwnd 和 lparam。第一个参数是窗口的句柄;第二个参数由应用程序定义。在此版本中,这两个参数都必须是整数。 

回调函数通常会返回非零值来表示成功,返回零来表示失败。本示例将返回值显式设置为 true,以继续进行枚举。 

创建一个委托,并将其作为参数传递给 EnumWindows 函数。平台调用会自动将委托转换为常见的回调格式。