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的问题总结的更多相关文章

  1. 解决Java调用Azure SDK证书错误javax.net.ssl.SSLHandshakeException

    Azure作为微软的公有云平台,提供了非常丰富的SDK和API让开发人员可以非常方便的调用的各项服务,目前除了自家的.NET, Java, Python, nodeJS, Ruby,PHP等语言都提供 ...

  2. 解决 Java 调用 Azure SDK 证书错误 javax.net.ssl.SSLHandshakeException

    Azure 作为微软的公有云平台,提供了非常丰富的 SDK 和 API 让开发人员可以非常方便的调用的各项服务,目前除了自家的 .NET.Java.Python. nodeJS.Ruby,PHP 等语 ...

  3. Android微信SDK API 调用教程1

    最近一直在调用微信的API,却发现一直调用不成功,纠结了好久,各方面找教程,找官方,官方里的文档也只是写得很模糊,说是按三步走. 1.申请App_ID 2.填写包名3. 获取程序签名的md5值, 这三 ...

  4. Android微信SDK API 调用教程

     最近一直在调用微信的API,却发现一直调用不成功,纠结了好久,各方面找教程,找官方,官方里的文档也只是写得很模糊,说是按三步走. 1.申请App_ID 2.填写包名3. 获取程序签名的md5值, 这 ...

  5. Android微信SDK API 调用教程【转】

    原文:http://blog.csdn.net/worker90/article/details/8211451 最近一直在调用微信的API,却发现一直调用不成功,纠结了好久,各方面找教程,找官方,官 ...

  6. Python如何调用新浪api接口的问题

    前言:这些天在研究如何调用新浪开放平台的api分析新浪微博用户的数据 成果:成功调用了新浪api获取了用户的一些个人信息和无数条公共微博 不足:新浪开放平台访问有限制,返回的数据着实有限,不足以分析问 ...

  7. Expo大作战(三十八)--expo sdk api之 FileSystem(文件操作系统)

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  8. Expo大作战(三十七)--expo sdk api之 GLView,GestureHandler,Font,Fingerprint,DeviceMotion,Brightness

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  9. Expo大作战(三十六)--expo sdk api之 ImagePicker,ImageManipulator,Camera

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

随机推荐

  1. 从零自学Hadoop(17):Hive数据导入导出,集群数据迁移下

    阅读目录 序 将查询的结果写入文件系统 集群数据迁移一 集群数据迁移二 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephis ...

  2. python基础(八)面向对象的基本概念

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 谢谢逆水寒龙,topmad和Liqing纠错 Python使用类(class)和对 ...

  3. 关于java中MessageFormat.format中单引号问题

    我们知道java中可以用MessageFormat.format来格式化字符串.这个方法在我们的实际开发中经常用到,有点类似模板,这样我们就不需要用很恶心的拼接字符串了.如下面 String s1=& ...

  4. 整理几篇比较好的AndroidUI动画开发文章

    第一篇,写的比较详细,新手可以看得懂: http://www.360doc.com/content/16/0128/08/30422106_531162539.shtml

  5. 【小白的CFD之旅】17 需要编程?

    小白经过大半个多月对于CFD的学习,终于对其大概轮廓有了初步的了解,尤其是在与小牛师兄交流之后.小牛师兄毕竟是专业学流体力学的,小白认为在流体力学理论方面自己与牛师兄至少存在5年的差距.不过小白并不气 ...

  6. [WPF系列]-Prism+EF

      源码:Prism5_Tutorial   参考文档 Data Validation in WPF √ WPF 4.5 – ASYNCHRONOUS VALIDATION Reusable asyn ...

  7. 【WPF系列】-TextBox常用知识点

    DataBinding中更新数据源的时机   TextBox .Text 属性的默认 UpdateSourceTrigger 值为 LostFocus.这意味着如果应用程序的 TextBox 包含数据 ...

  8. BZOJ 3524: [Poi2014]Couriers [主席树]

    3524: [Poi2014]Couriers Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1892  Solved: 683[Submit][St ...

  9. NOIP2013pj车站分级[拓扑排序]

    题目描述 一条单向的铁路线上,依次有编号为 1, 2, …, n 的 n 个火车站.每个火车站都有一个级 别,最低为 1 级.现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车 次停靠了 ...

  10. POJ2115 C Looooops[扩展欧几里得]

    C Looooops Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 24355   Accepted: 6788 Descr ...