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. sshfs 实现普通用户可读写

    先实现普通用户免密码host1可登入host2host1# yum install fuse sshfs; 如果装不上,需要安装epep源 --enablerepo=epelhost1# su - e ...

  2. hbase伪分布式平台搭建(centos 6.3)

    搭建完<hadoop伪分布式平台>后就开始搭建hbase伪分布式平台了.有了hadoop环境,搭建hbase就变得很容易了. 一.Hbase安装 1.从官网下载最新版本Hbase安装包1. ...

  3. MAC OS X的ACL扩展权限设置

    在WEB开发时,网站是以_www的用户运行的,而我在本地是以liuwencan的用户编辑的.这就带来一个问题:如果所有文件属于liuwencan,那么网站运行需要写文件时就因无权限而失败:如果所有文件 ...

  4. Centos 6.5 安装ELK

    安装java 查看java安装路径 修改环境变量 添加如下内容: export JAVA_HOME=/usr/java/jdk1.8.0_91 export PATH=$JAVA_HOME/bin:$ ...

  5. 【java开发】数据类型

    ok,为期两天的ubuntu常用命令学习结束,现在开始java语言的学习. 上篇结尾说了ubuntu下的jdk文件安装,现在顺便说一下win下的jdk环境变量配置 在官网下载符合系统的jdk文件,可以 ...

  6. Postgresql扩展及UUID

    切换数据库 \connect $DBNAME 查看Postgresql的可用扩展 SELECT * FROM pg_available_extensions; 安装所需扩展 CREATE EXTENS ...

  7. Release Management 安装 之 集成TFS

    集成TFS时需要在TFS服务器执行 tfssecurity /g+ "Team Foundation Service Accounts" n:ALM\rmtfsint ALLOW ...

  8. 迅为-iMX6开发板 飞思卡尔iMX6Q开发板 工业级开发板

    了解详情请点击迅为官网:http://topeetboard.com 迅为-i.MX6开发板是采用Freescale Cortex-A9 四核i.MX6Q处理器,主频1GHz,2G DDR3内存,16 ...

  9. FeWeb基础之HTML

    FeWeb基础之HTML 1.HTML简介 HTML是一种超文本标记语言,它的文件扩展名为.html,它的所有部分都是由标记<...>和标记</...>包括起来. 在一个HTM ...

  10. [WPF系列]-数据邦定之DataTemplate 使用 DataTrigger 来应用属性值

    使用 DataTrigger 来应用属性值 当前表示不会告诉我们某个 Task 是家庭任务还是办公室任务.记住 Task 对象拥有类型为 TaskType 的 TaskType 属性,该类型是一个枚举 ...