一个极度复杂的Marshal
2005-01-12 23:58
134 查看
前一段时间遇到要使用C#调用一个dll的情况,其中有个回调函数,在C++里面的定义是这样的:
注册回调函数RegisterStreamDirectReadCallback
DLLEXPORT_API int __stdcall RegisterStreamDirectReadCallback(STREAM_DIRECT_READ_CALLBACK StreamDirectReadCallback,void *Context);
回调函数定义如下:
typedef int (*STREAM_DIRECT_READ_CALLBACK)(ULONG channelNumber,void *DataBuf,DWORD Length,int FrameType,void *context);
需要在C#里面通过Marshal实现这两个函数,对于第一个注册函数,定义如下:
[DllImport("DS40xxSDK.dll")]
public static extern short RegisterStreamDirectReadCallback(STREAM_DIRECT_READ_CALLBACK StreamDirectReadCallback, IntPtr Context);
回调函数用Delegate定义如下:
public unsafe delegate short STREAM_DIRECT_READ_CALLBACK( uint channelNumber, void * DataBuf,uint Length,int FrameType,void * Context);
然后实现函数定义如下:
public unsafe short StreamDirectReadCallback(uint channelNumber, void * DataBuf,uint Length,int frameType,void * Context){}
最后调用的时候回调的确成功了,调用如下:
RegisterStreamDirectReadCallback(new STREAM_DIRECT_READ_CALLBACK (this.StreamDirectReadCallback ),new IntPtr (0));
但是当回调函数结束以后,报错,而且当前没有代码,所以没有办法调试,估计还是定义的问题,研究了蛮久,还是不行,最后发现有些东西C#花的时间太多,得不偿失,所以最后还是决定使用C++来实现了。不过这个问题我还是想研究清楚,到底为啥呢?
关于void *尝试过IntPtr,也尝试过unsafe,总之都是不行,可能是void * DataBuf的原因,返回的时候由于不知道这个参数的大小,找不到入口了,其他的回调函数因为参数简单,只有一个int或者一个dword,可以直接返回。这个Marshal还是要好好研究研究的。
注册回调函数RegisterStreamDirectReadCallback
DLLEXPORT_API int __stdcall RegisterStreamDirectReadCallback(STREAM_DIRECT_READ_CALLBACK StreamDirectReadCallback,void *Context);
回调函数定义如下:
typedef int (*STREAM_DIRECT_READ_CALLBACK)(ULONG channelNumber,void *DataBuf,DWORD Length,int FrameType,void *context);
需要在C#里面通过Marshal实现这两个函数,对于第一个注册函数,定义如下:
[DllImport("DS40xxSDK.dll")]
public static extern short RegisterStreamDirectReadCallback(STREAM_DIRECT_READ_CALLBACK StreamDirectReadCallback, IntPtr Context);
回调函数用Delegate定义如下:
public unsafe delegate short STREAM_DIRECT_READ_CALLBACK( uint channelNumber, void * DataBuf,uint Length,int FrameType,void * Context);
然后实现函数定义如下:
public unsafe short StreamDirectReadCallback(uint channelNumber, void * DataBuf,uint Length,int frameType,void * Context){}
最后调用的时候回调的确成功了,调用如下:
RegisterStreamDirectReadCallback(new STREAM_DIRECT_READ_CALLBACK (this.StreamDirectReadCallback ),new IntPtr (0));
但是当回调函数结束以后,报错,而且当前没有代码,所以没有办法调试,估计还是定义的问题,研究了蛮久,还是不行,最后发现有些东西C#花的时间太多,得不偿失,所以最后还是决定使用C++来实现了。不过这个问题我还是想研究清楚,到底为啥呢?
关于void *尝试过IntPtr,也尝试过unsafe,总之都是不行,可能是void * DataBuf的原因,返回的时候由于不知道这个参数的大小,找不到入口了,其他的回调函数因为参数简单,只有一个int或者一个dword,可以直接返回。这个Marshal还是要好好研究研究的。
相关文章推荐
- 一个极度复杂的jsp页面
- 【Sql语句】自己摸索出得比较复杂的一个查询语句
- TMJ不仅仅是一个复杂庞大的项目
- asp.net2.0生成一个复杂的验证码,背景随机,字体随机,中英文数字随机
- 4.给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。 要求:空间复杂度O(1),时间复杂度为O(n)
- 一个Windows 系统究竟有多复杂?
- 一个复杂引用的实例『只可以作为参考,此程序写法不推荐』
- 一个更复杂一些的例子
- 一个可以生成复杂结构的json数据的简单例子
- 判断一个整数数组中是否有重复数字出现的O(n)时间复杂度算法
- 脚本复杂又简单--一个菜单模块
- 查找一个字符串中第一个只出现两次的字符。比如:“abcdefabcdefabc”中第一个只出现两次为‘d’,要求时间复杂度为O(N),空间复杂度为O(1)
- 小米手机销量暴跌36% 雷军做错了什么?(人的需求是复杂的,而不是仅仅是一个性价比;要做体验价格比,而不是配置价格比)good
- 如何辨认一个复杂声明表达式子中变量的类型?
- 每天学习一算法系列(25)(一个台阶总共有n 级,如果一次可以跳1 级,也可以跳2 级,求总共有多少总跳法,并分析算法的时间复杂度。)
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- 点在多边形内算法——判断一个点是否在一个复杂多边形的内部翻译 (转)
- 复杂页面消退的一个简单实例
- Spring Boot-构建一个复杂的RESTful API及单元测试
- 【二分查找】在一个长度未知的数组中查找一个数,返回其下标,时间复杂度O(logn)