VC写的OCX,其中一个函数的参数为long型,是回调函数的地址
C#中调用OCX时,将long型参数转换成了int型
现在C#调用这个OCX,该怎么吧C#中的回调函数的地址传递给这个int参数呢?C# OCX回调函数

解决方案 »

  1.   

    在C#里定义函数的托管,然后把托管函数定义(相当于c++函数指针)传过去参考下面例子,long型你改好托管的类型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处理回调函数的方法,但是调用OCX该怎么处理呢?
    C#已经将OCX里里面函数的long参数对应成了int型,这个int参数应该是个地址
      

  3.   

    用CreateInstance创建实例
    用InvokeMember调用,
    参数定义成object[],传你的long型试试。
      

  4.   

    这样解决
            //回调函数形式
            public static int ProgressStart()                               //开始
            {
                MessageBox.Show("开始");            return 1;
            }
            public delegate int ProgressStart_CallBack();
            static ProgressStart_CallBack Start_CallBack = new ProgressStart_CallBack(ProgressStart);
            IntPtr ProgressStart_Ptr = Marshal.GetFunctionPointerForDelegate(Start_CallBack);
            /***
            YourFuc(ProgressStart_Ptr.ToInt32()); //你的调用代码
      

  5.   

       回调函数的地址当然是写在你OCX接口中了,return 返回,在C#中用适当的方法接受即可。
      

  6.   

    ocx注册后,直接添加到引用,VS自然帮你转好各种属性方法和事件