2025年pcl头文件(头文件cctype)

pcl头文件(头文件cctype)因为实验室图像处理的算法都是在 OpenCV 下写的 还有就是导航的算法也是用 C 写的 然后界面部分要求在 C 下写 所以不管是 Socket 通信 还是调用 OpenCV 的 DLL 模块 都设计到了 C 和 C 数据类型的对应 还有结构体的封装使用 在夸语言调用方面 Java 和 C 都只能调用 C 格式导出的动态库 因为 C 数据类型比较单一 容易映射 两者都是在本地端提供一套与之映射的 C 或者 Java 的描述接口

大家好,我是讯享网,很高兴认识大家。



因为实验室图像处理的算法都是在OpenCV下写的,还有就是导航的算法也是用C++写的,然后界面部分要求在C#下写,所以不管是Socket通信,还是调用OpenCV的DLL模块,都设计到了C#和C++数据类型的对应,还有结构体的封装使用。在夸语言调用方面,Java和C#都只能调用C格式导出的动态库,因为C数据类型比较单一,容易映射,两者都是在本地端提供一套与之映射的C#或者Java的描述接口,通过底层处理这种映射关系达到调用的目的。

 一. 结构体的传递

  在C#下对应的结构体定义:

  可以通过两种方式来调用非托管的函数SetVersionPtr:

1. 方式一(传入结构体引用),在C#中,结构体是以传值的方式传递的,类才是一传地址的方式传递的,加上关键字ref就可以了。C端传递了两种不同类型的参数,都可以通过引用来解决。

  2. 方式二(传入IntPtr(平台通用指针))

 对应的函数在C#中的声明:

    测试代码:

  上面的两种方法得区别是:

第一种方法是先创建一个等价的结构体,然后把这个结构体的引用传递给DLL中的接口函数。第二种方法是申请一块结构体大小的非托管内存,然后向内存中写入数据。调用的时候,只把这块非托管的内存的指针传递给DLL中的接口函数。其实第二种方法可以不用事先定义结构体,只需要知道结构体的大小,申请相应的非托管内存就可以了。

二.结构体数组的传递

 DLL中非托管代码:

调用代码接口:

测试代码:

  上面的代码中有两处需要说明一下:


讯享网

(1)C#中的IntPtr指针做相应的运算的时候,要首先把IntPtr做相应的转换,然后运算。运算结束之后还要再做相应的转换,还原成原来的IntPtr。

(2)Marshal.Copy这个函数的功能是:将数据从托管数组复制到非托管内存指针,或从非托管内存指针复制到托管数组。

三. 复杂结构体的传递

1. 输出参数,结构体作为指针传出

 非托管部分代码:

  上面DLL 的导出函数要求传递的参数为它自定义的Class结构体数组, 那么我们在C#调用它时也要自定义对应的结构体了,

我们可以定义为如下:

  需要注意的是,这2个结构体中的数组大小一定要跟C++中的限定一样大小哦,接下来如何使用这个API来正确的获取数据呢,大多数人可能想到像这样的处理方式:

  没错,这样的处理是没问题的,但是我们的API的参数是Class数组,这种处理方式只是传递一个Class结构体参数,所以这种方式在这里就不太合适了,!

 那大家就想到先Class[] myclass = new Class[MaxClass]; 然后在用Marshal.AllocHGlobal 来获取myclass 数据的指针,

其实这样也是错的, 因为 Class结构中包含了,不能直接封送的Student结构,所以无论如何上面的想法是错误的!

那要怎么办呢,其实很简单,就是先分配一段非托管内存,并调用API后,再将非托管内容数据读取到托管结构体数据中! 

示例演示代码如下:

小讯
上一篇 2025-04-24 11:14
下一篇 2025-04-19 16:26

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/196268.html