C# 调用C++ SDK/API的问题总结
1.回调函数的使用
c++的回调函数如下所示:
typedef void (CALLBACK *Data)(long lHandle, DATA_TYPE eDataType, unsigned char *pBuffer, unsigned long lBufSize, void *pUserData)
调用回调函数的函数如下所示:
SDK_API long STDCALL StartData(long lID, S_DATA_INFO *pDataInfo, Data fData, Void *pUserData = NULL)
C#里对应的就是使用委托了。
回调函数对应的委托声明:
CallingConvention.StdCall还是很有用的。
[UnmanagedFunctionPointerAttribute(CallingConvention.StdCall)]
public delegate void Data(int lHandle,
DATA_TYPE eDataType,
IntPtr pBuffer,
uint lBufSize,
IntPtr pUserData);
调用委托的函数:
[DllImport("SDK.dll")]
public extern static int StartData(int lID,
ref DATA_INFO pDataInfo,
Data fRealData,
IntPtr pUserData);
使用方法:
首先声明一个全局变量myData,如果是函数里临时声明的变量可能在函数执行结束时就被垃圾回收了,后面的自然无法执行了。
SDK.Data myData;
使用时给它初始化
myCBRealData = new IPCSDK.CBRealData(DoData);
然后调用执行函数
int lData = SDK.StartData(ID, ref dataInfo, myData, IntPtr.Zero);
最后DoData函数里执行回调函数该做的事
public void DoData(int lHandle, SDK.DATA_TYPE eDataType, IntPtr pBuffer, uint lBufSize, IntPtr pUserData)
{
....
}
2.struct 结构体大小的设置
C++很简单,数组可以直接定义长度
typedef struct tagInfo
{
unsigned char ucSoftWareVersion[4];//软件版本
}S_INFO;
C#:
要使用[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public struct S_INFO
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public byte[] ucSoftWareVersion;//软件版本
};
3.const char * 等这一类的转换
char * 一般直接用string就好了,
const char *一般要 StringBuilder
出现错误就多试试了
其他信息: 对 PInvoke 函数“SDK::Open”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。
这个错误网上不少说是要在函数上面加CallingConvention.StdCall
[DllImport("SDK.dll", CallingConvention= CallingConvention.StdCall, CharSet= CharSet.Ansi)]
试了没用,最后发现是const char *要 StringBuilder,用string、intptr都没用
4.C++的long一般是4个字节对应C#的int
5.指针类型一般用intptr,然后再读出来
6.其他类型实在不清楚就查一下,各种转换文章很多,当然不一定全对,要多尝试
C# 调用C++ SDK/API的问题总结的更多相关文章
- 解决Java调用Azure SDK证书错误javax.net.ssl.SSLHandshakeException
Azure作为微软的公有云平台,提供了非常丰富的SDK和API让开发人员可以非常方便的调用的各项服务,目前除了自家的.NET, Java, Python, nodeJS, Ruby,PHP等语言都提供 ...
- 解决 Java 调用 Azure SDK 证书错误 javax.net.ssl.SSLHandshakeException
Azure 作为微软的公有云平台,提供了非常丰富的 SDK 和 API 让开发人员可以非常方便的调用的各项服务,目前除了自家的 .NET.Java.Python. nodeJS.Ruby,PHP 等语 ...
- Android微信SDK API 调用教程1
最近一直在调用微信的API,却发现一直调用不成功,纠结了好久,各方面找教程,找官方,官方里的文档也只是写得很模糊,说是按三步走. 1.申请App_ID 2.填写包名3. 获取程序签名的md5值, 这三 ...
- Android微信SDK API 调用教程
最近一直在调用微信的API,却发现一直调用不成功,纠结了好久,各方面找教程,找官方,官方里的文档也只是写得很模糊,说是按三步走. 1.申请App_ID 2.填写包名3. 获取程序签名的md5值, 这 ...
- Android微信SDK API 调用教程【转】
原文:http://blog.csdn.net/worker90/article/details/8211451 最近一直在调用微信的API,却发现一直调用不成功,纠结了好久,各方面找教程,找官方,官 ...
- Python如何调用新浪api接口的问题
前言:这些天在研究如何调用新浪开放平台的api分析新浪微博用户的数据 成果:成功调用了新浪api获取了用户的一些个人信息和无数条公共微博 不足:新浪开放平台访问有限制,返回的数据着实有限,不足以分析问 ...
- Expo大作战(三十八)--expo sdk api之 FileSystem(文件操作系统)
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- Expo大作战(三十七)--expo sdk api之 GLView,GestureHandler,Font,Fingerprint,DeviceMotion,Brightness
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- Expo大作战(三十六)--expo sdk api之 ImagePicker,ImageManipulator,Camera
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
随机推荐
- mysql-7 数据检索(5)
联结(join) SQL最强大的功能之一就是能在数据检索查询的执行中联结(join)表.联结就是利用SQL的SELECT能执行的最重要的操作. 例子:此例子包含两个表,一个表是vendors , ve ...
- 从零自学Hadoop(01):认识Hadoop
本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 阅读目录 序 Hadoop 项目起源 优点 核心 ...
- maven archetype生成自定义项目原型(模板)
maven archetype可以将一个项目做成项目原型,之后只需要以此原型来创建项目,那么初始创建的项目便具有原型项目中的一切配置和代码.通俗讲就是一个项目模板. eclipse中那些快速生成mav ...
- 基本shell编程【2】-服务端发布脚本
set -x deployBase="/var/lib/tomcat7/webapps" bakBase="/root/bak" echo "auto ...
- [WPF系列]-使用Binding来同步不同控件的Dependency property
简介 项目中经常会用到,同步两个控件的值,本文就简单列举两种方式来同步不同控件的两个Dependency Property. 示例 效果图: 只使用C#代码: //获取slider1的ValueDep ...
- request属性 request.getAttribute()
一.request.getParameter() 和request.getAttribute() 区别 (1)request.getParameter()取得是通过容器的实现来取得通过类似post,g ...
- CF444C. DZY Loves Colors[线段树 区间]
C. DZY Loves Colors time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- return和finally的执行和联系
1.try{}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 也许你的答案是在return之前,但往更细地说, ...
- Centos7 防火墙简介(一)
Centos7下的防火墙默认是通过一个守护进程(firewalld)为网络(network) 以及与之相关的连接(connections)和接口(interface)提供一个可信层,同时支持网络空间( ...
- Redis从入门到精通之一:序篇
Redis一直是我想好好研究的组件,但是之前受限于工作场景,没有真正意义的使用过.但是目前工作中,Redis作为主要的缓存组件来缓冲服务器的压力.所以,本序列主要结合实际工作中遇到的各种Redis的设 ...