大家好,我用的是VS2010 C#,dll以前没有调过,现在我要调一个c++写的dll,项目是上位机与下位机通信方面的,dll基本上要实现的功能就是:1.我将部分数据传给dll,dll解析并显示数据。2.dll回调我的C#主程序,将dll要发给下位机的命令数据传给C#主程序,C#主程序发给下位机。目前,功能1已经实现,到了功能2,由于搞不懂C#中dll的回调机制是如何实现的,查了好多资料,也没能解决问题,望大家帮忙,先行谢过。最好是带上实例。
我功能1的代码
 
       [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调用,请指点  

解决方案 »

  1.   

    非托管回调示例[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; } } 
      

  2.   

    回调函数是托管应用程序中可帮助非托管 DLL 函数完成任务的代码。对回调函数的调用将从托管应用程序中,通过一个 DLL 函数,间接地传递给托管实现。在用平台调用调用的多种 DLL 函数中,有些函数要求正确地运行托管代码中的回调函数。开始实现之前,先查看 EnumWindows 函数的签名。EnumWindows 具有以下签名:   复制代码 
    BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)
     表示此函数需要回调的线索之一是存在 lpEnumFunc 参数。如果参数采用指向回调函数的指针,其名称中通常会有 lp(长指针)前缀与 Func 后缀的组合。有关 Win32 函数的文档,请参见 Microsoft Platform SDK。 创建托管回调函数。该示例声明一个名为 CallBack 的委托类型,此委托类型采用两个参数:hwnd 和 lparam。第一个参数是窗口的句柄;第二个参数由应用程序定义。在此版本中,这两个参数都必须是整数。 回调函数通常会返回非零值来表示成功,返回零来表示失败。本示例将返回值显式设置为 true,以继续进行枚举。 创建一个委托,并将其作为参数传递给 EnumWindows 函数。平台调用会自动将委托转换为常见的回调格式。
      

  3.   

    谢谢 大家  那个问题已经解决了  现在双向都能调用,只是参数方面出现新的问题。DLL中有一个byte指针类型的参数,还有一个长度,目的是把命令数据传给C#主程序,C#主程序这边 收到参数长度 正确,数组为空public static extern void TXYS_RegDataArriveEventHandler(TXYS_DataArriveHandler_t fHandlerFunc);   //注册数据到来         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
            public delegate void TXYS_DataArriveHandler_t(ref byte  sBuf, int nLen, int nType);        TXYS_DataArriveHandler_t dataArrive;
            public void fDataArriveHandler(ref byte btData1 , int nLen, int nType)
            {
                byte [] btData=new byte [nLen];
                Marshal.Copy(btData1, btData, 0, nLen);
             }这是回调函数声明及定义部分   高手请指点  谢谢
      

  4.   

    dataArrive = new TXYS_DataArriveHandler_t(this.fDataArriveHandler);
                TXYS_RegDataArriveEventHandler(dataArrive);//注册回调函数 
    上面代码补充  大家请帮忙