C#调用C/C++动态链接库笔记(二)

C/C++函数指针在C#中的调用

1:C中声明**

下面C的源代码,要调用的函数参数中带有函数指针,该函数指针指向一个回调函数。

_LIBAPI void   CallFromDll(X x);
void  CallFromDll(X x)
{
	DevMsg msg;

	msg.TagStatus.distance=30;
	msg.TagStatus.mode=20;
	msg.TagStatus.voltage=8.8;
	msg.TagStatus.isMove=10;
	msg.TagStatus.isCut=40;
	msg.TagStatus.version=11;
	//msg.TagStatus.mode=1;
	x(msg);
}

对于函数体内的是什么,不重要,关键在于函数指针x,下面是x的声明:

typedef void(*X)(DevMsg msg);

在一些回调函数中,经常碰到这样的封装方式,调用的难点就在于这个函数指针。

2C#中调用

第一步:导入,函数指针用Intptr。

        [DllImport("fun_ptr.dll", EntryPoint = "CallFromDll",CallingConvention =CallingConvention.Cdecl), ]
        public static extern void CallFromDll(IntPtr fun);

第二步:创建函数委托,委托这个概念理解了好久,最后还是作者把它当成了函数指针。。。要是想了解委托的,去搜搜别家的博客,还蛮多的。

		public delegate void MsgHandler1(DevMsg msg);

第三步:写回调函数的函数体:这里写了一个简单的更新ui的代码。

	    public void MsgReceiver(DevMsg msg)
	    {
    	    richTextBox1.Text += "The resultis:" + msg .tagID.ToString()+ "\n";
        }

第四步:啥都不说,看代码就明白了,这样函数指针的调用就ok了。

        [DllImport("fun_ptr.dll", EntryPoint = "CallFromDll",CallingConvention =CallingConvention.Cdecl), ]
        public static extern void CallFromDll(IntPtr fun);

        private void button3_Click(object sender, EventArgs e)
        {
           // f指向函数
            MsgHandler1 f1 = new MsgHandler1(MsgReceiver);
            //得到函数地址
            IntPtr s1= Marshal.GetFunctionPointerForDelegate(f1);
            CallFromDll(s1);
        }

作者在实际过程中还碰到了更多问题,还有很多没想起来,如果有问题欢迎评论或小窗,作者酌情更新。

你可能感兴趣的:(C#笔记)