C#调用C++编写的DLL函数各种参数传递问题
----在网上查了一个星期,终于找到解决方法
1. 不返回值的参数
C++ 原型:
bool SendNewSms(char *szTel, char *szMessage);
C#引用;
[DllImport( "CdmaCard.dll",EntryPoint="SendNewSms")] public static extern bool SendNewSms(string phone,string msg);
2. 带返回值(char *)
C++原型:
BOOL GetCardErrorMessage(char *szErrorMessage , int errorCode);
C#引用
[DllImport( "CdmaCard.dll",EntryPoint="GetCardErrorMessage")] public static extern int GetCardErrorMessage(StringBuilder msg,int errorCode);
StringBuilder buf = new StringBuilder(1024);//指定的Buf大小必须大于可能的最大长度 GetCardErrorMessage(buf,1);
3. 带返回值(其他类型)
C++原型:
BOOL GetSmsSaveStation (int *nSmsStation);
C#引用
[DllImport( "CdmaCard.dll",EntryPoint="GetSmsSaveStation")] public static extern bool GetSmsSaveStation(ref int nStation);
4. 传递结构体指针(C++填充) C++原型: struct NET_INFO_STRUCT { DWORD nDurationTime; //持续时间 double nReceiveByte; //接收字节 double nSendByte; //发送字节 }; BOOL NetGetConnectDetail(NET_INFO_STRUCT *lpNetInfo); C#引用 public struct NET_INFO_STRUCT { public uint nDurationTime; //持续时间 public double nReceiveByte; //接收字节 public double nSendByte; //发送字节 } [DllImport( "CdmaCard.dll",EntryPoint="NetGetConnectDetail")] public static extern int NetGetConnectDetail(ref NET_INFO_STRUCT pNetInfo); NET_INFO_STRUCT netInfo = new NET_INFO_STRUCT(); NetGetConnectDetail(ref netInfo);
5. 传递结构体数组(C++来填充) C++原型: struct UIM_BOOK_STRUCT { int UimIndex; char szName[15]; char szPhone[21]; }; int ReadUimAllBook(UIM_BOOK_STRUCT lpUimBookItem[],int nMaxArraySize);
C#引用 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]//可以指定编码类型 public struct UIM_BOOK_STRUCT { public int UimIndex; [MarshalAs(UnmanagedType.ByValTStr, SizeConst= 15)] public string szName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst= 21)] public string szPhone; };
[DllImport( "CdmaCard.dll",EntryPoint="ReadUimAllBook")] public static extern int ReadUimAllBook([Out] UIM_BOOK_STRUCT [] lpUimBookItem,int nMaxArraySize);
UIM_BOOK_STRUCT[] p = new UIM_BOOK_STRUCT[20]; int ret = ReadUimAllBook(p,p.Length);
6. 注意问题 类型不一致,会导致调用失败, (1) long 类型,在C++中是4字节的整数,在C#中是8字节的整数; (2) 字符串类型的设置不正确;
转载于:https://www.cnblogs.com/kun91101/p/3190891.html
C#调用C++编写的DLL函数各种参数传递问题相关推荐
- 【转】Linux下c++调用自己编写的matlab函数:通过mcc动态链接库.so实现
转自:Linux下c++调用自己编写的matlab函数:通过mcc动态链接库.so实现_Jaster_wisdom的专栏-CSDN博客 之前在这里和这里调用了matlab自带的一些函数,是通过matl ...
- oracle sql 调用自定义函数_PSCAD入门教程(第7节):怎样调用fortran编写的自定义函数?(附模型)...
PSCAD入门教程(第7节):怎样调用fortran编写的自定义函数?(附模型)mp.weixin.qq.com https://www.zhihu.com/video/12422083467175 ...
- 阿里云服务器上调用自己编写的matlab函数
该博客为<Ubuntu 相关>系列博客的第五篇,该系列博客主要对Ubuntu安装各种软件或者库进行一个记录,方便重装系统后快速恢复工作. 这是进项目组以来接受的第一个任务的后续工作,以此记 ...
- pb调用c语言dll,PB调用C#编写的Dll类库
在c# 中编写com组件,供PB调用实例 前言:c#中写的dll直接是不能被pb调用的,只有写成com组件才可以调用,所以用c#写dll时要注意. c#中新建类库 类库类型为通用类库,项目名为AddC ...
- java Jacob调用VB编写的DLL(COM组件)
项目上有调用Visual Basic 6.0编写的DLL文件的需求,在使用JNA调用无果后,在网上找了部分资料,整理如下. 为什么用JNA无法调用? VB生成的COM组件,虽然是dll后缀,但事实上, ...
- python调用c#注意事项_Python调用C#编写的DLL
起因是工作中需要用的开发编写的DLL,但是它是使用C#编写的,本人不想使用C#去写测试代码,所以需要使用Python来掉这个DLL内的方法 就用这个就很好,不要问为啥不用微软的Ironpython和别 ...
- java调用c写的dll jna_jna调用c编写的dll
我们团队目前开发的产品是用java语言编写的,大家都知道,java编写的代码随便都可以被反编译,导致别人可能会看到你"裸奔"的样子.所以,为了避免这种安全隐患,团队最终商定,将部分 ...
- 易语言c调用,易语言调用C++编写的DLL
511遇见网站最近在录制一套易语言编写DLL及调用和Hook,今天记录一下使用VS2015编写一个C++的Dll,易语言来调用. 步骤: 1.启动VS2015 2.创建工程 3.Visual C++ ...
- vs2013 c# 中调用 c 编写的dll出错的可能错误
先说出错原因: 堆栈调用顺序 解决办法: 使用 __stdcall 或 使用C#属性 CallingConvention 起因是我想在c#中调用c函数结果出错了 如下 C 头文件 ...
最新文章
- Hyper-V 2节点集群高可用的限制
- mysql和redis的区别
- 计算机网络系统中每台计算机的地位是什么,东北师范计算机应用基础15秋在线作业1满分答案...
- MySQL存储引擎中的MyISAM和InnoDB区别详解
- [转] Deep Learning(深度学习)学习笔记整理系列
- axure中的中继器
- 软件项目风险管理介绍
- ThinkPad预装win8系统机型安装win7系统的操作指导
- 安卓总结 之 OkHttp使用及源码分析(三)
- Electron - 创建跨平台的桌面客户的应用程序
- 达到年薪 40W 必需掌握的技术
- python 存储图片 alpha_保存时Matplotlib图形面颜色alpha(背景色、透明度)
- Valgrind快速入门指南
- Sql Server REPLACE函数的使用
- extract-text-webpack-plugin用法
- 骑马与砍杀是用python编的_骑马与砍杀编辑模式怎么用
- Python多线程报错之RuntimeError
- 【优化选址】基于matlab遗传算法求解多城市多应急物流中心选址优化问题【含Matlab源码 H001期】
- WinForm公共控件
- 使用神经网络实现对天气的预测