我现在在C++中有这样一个函数
typedef int (CALLBACK* DS_SNAP_PROC)(BYTE *pImageBuffer);
我在另外一个函数要用到DS_SNAP_PROC来定义另一个参数如:
CameraInit(DS_SNAP_PROC pCallbackFunction, IN DS_RESOLUTION uiResolution, IN HWND hWndDisplay, IN LPVOID lpThreadparam );然后我要在C#中通过调用dll函数库的办法来调用CameraInit函数,但是我现在不知道如何在C#中定义
“DS_SNAP_PROC pCallbackFunction”参数,请高手们指教指教呀,急!谢谢。

解决方案 »

  1.   

    c#种声明delegate,然后实例化该delegate,作为函数指针传入。
      

  2.   


            [DllImport("coredll.dll", EntryPoint = "waveInOpen", SetLastError = true)]
            private static extern int waveInOpen(ref IntPtr t, uint id, ref WaveFormat_GSM pwfx, WAVEINPROC dwCallback, uint dwInstance, uint fdwOpen);
            public delegate void WAVEINPROC(IntPtr hdrvr, int uMsg, int dwUser, ref WaveHdr wavhdr, int dwParam2);
            WAVEINPROC waveinproc;
            private void Form1_Load(object sender, EventArgs e)
            {
                waveinproc = onwaveinproc;
            }
            private void onwaveinproc(IntPtr hdrvr, int uMsg, int dwUser, ref WaveHdr wavhdr, int dwParam2)
            {
                //
            }  例如这个,DLL API waveInOpen中WAVEINPROC dwCallback是一个函数指针,当然在C中并不是WAVEINPROC这个类型,WAVEINPROC是C#中定义的一个delegate,可以作为函数指针。WAVEINPROC waveinproc指向了onwaveinproc这个方法(函数),这样DLL中回调该函数指针指向的方法(函数)时,就是回调onwaveinproc。
      

  3.   

    针对你这个例子,我不知道DS_RESOLUTION在Dll中是什么东西,暂且把它定义为一个结构体    class Program
        {
            struct DS_RESOLUTION
            {
                //
            }
            delegate int DS_SNAP_PROC(byte[] pImageBuffer);
            static DS_SNAP_PROC ds_snap_proc;
            [DllImport("yourdll")]
            static extern void CameraInit(DS_SNAP_PROC pCallbackFunction, ref DS_RESOLUTION uiResolution, ref IntPtr hWndDisplay, ref IntPtr lpThreadparam );
            static void Main(string[] args)
            {
                ds_snap_proc = CallBack;
                DS_RESOLUTION resolution;
                //
                IntPtr hwnddisplay = IntPtr.Zero;
                IntPtr lpthreadparam = IntPtr.Zero;
                CameraInit(CallBack, ref resolution, ref hwnddisplay, ref lpthreadparam);
                Console.ReadLine();
            }
            static int CallBack(byte[] b)
            {
                //
                return 1;
            }
        }