关于C#调用C++dll的问题

在c#调用dll中遇到了个巨坑,请大侠&大神帮忙
c++定义:
//! 长度为10的字符串
typedef char TAPISTR_10[11];
typedef char TAPICHAR;
typedef char TAPIDTSTAMP[24];

//! int 32
typedef int TAPIINT32;
//! unsigned 32
typedef unsigned int TAPIUINT32;
//! int 64
typedef long long TAPIINT64;
//! unsigned 64
typedef unsigned long long TAPIUINT64;
//! unsigned 16
typedef unsigned short TAPIUINT16;
//! unsigned 8
typedef unsigned char TAPIUINT8;
//! real 64
typedef double TAPIREAL64;

typedef TAPIREAL64 TAPIQPRICE;
typedef TAPIUINT64 TAPIQVOLUME;
typedef TAPIINT64 TAPIQDIFF;

struct TapAPICommodity
{
TAPISTR_10 ExchangeNo;

TAPICommodityType CommodityType;

TAPISTR_10 CommodityNo;

};

struct TapAPIContract
{
TapAPICommodity Commodity;

TAPISTR_10 ContractNo1;

TAPISTR_10 StrikePrice1;

TAPICallOrPutFlagType CallOrPutFlag1;

TAPISTR_10 ContractNo2;

TAPISTR_10 StrikePrice2;

TAPICallOrPutFlagType CallOrPutFlag2;

};

struct TapAPIQuoteWhole
{
TapAPIContract Contract;

TAPISTR_10 CurrencyNo;

TAPICHAR TradingState;

TAPIDTSTAMP DateTimeStamp;

TAPIQPRICE QPreClosingPrice;

TAPIQPRICE QPreSettlePrice;

TAPIQVOLUME QPrePositionQty;

TAPIQPRICE QOpeningPrice;

TAPIQPRICE QLastPrice;

TAPIQPRICE QHighPrice;

TAPIQPRICE QLowPrice;

TAPIQPRICE QHisHighPrice;

TAPIQPRICE QHisLowPrice;

TAPIQPRICE QLimitUpPrice;

TAPIQPRICE QLimitDownPrice;

TAPIQVOLUME QTotalQty;

TAPIQPRICE QTotalTurnover;

TAPIQVOLUME QPositionQty;

TAPIQPRICE QAveragePrice;

TAPIQPRICE QClosingPrice;

TAPIQPRICE QSettlePrice;

TAPIQVOLUME QLastQty;

TAPIQPRICE QBidPrice[20];

TAPIQVOLUME QBidQty[20];

TAPIQPRICE QAskPrice[20];

TAPIQVOLUME QAskQty[20];

TAPIQPRICE QImpliedBidPrice;

TAPIQVOLUME QImpliedBidQty;

TAPIQPRICE QImpliedAskPrice;

TAPIQVOLUME QImpliedAskQty;

TAPIQPRICE QPreDelta;

TAPIQPRICE QCurrDelta;

TAPIQVOLUME QInsideQty;

TAPIQVOLUME QOutsideQty;

TAPIQPRICE QTurnoverRate;

TAPIQVOLUME Q5DAvgQty;

TAPIQPRICE QPERatio;

TAPIQPRICE QTotalValue;

TAPIQPRICE QNegotiableValue;

TAPIQDIFF QPositionTrend;

TAPIQPRICE QChangeSpeed;

TAPIQPRICE QChangeRate;

TAPIQPRICE QChangeValue;

TAPIQPRICE QSwing;

TAPIQVOLUME QTotalBidQty;

TAPIQVOLUME QTotalAskQty;

};

请问TapAPIContract怎么转换成C#的对应类型,我转换的时候已经成功转换了char数组。字符显示正常,但是double和long等数值类的类型全都不对。急急急~

1

3个回答

同事遇到一个问题,C#调用c++的接口,返回值总是错误,但是c++的同事单步调试时正确的
经过半天调试才发现,是C++接口定义的问题

c++接口返回值定义为了bool。在x86平台c++中的bool占用1个字节,C#中占用4个字节

在编译器默认的对其方式下,调用出现了混乱

解决办法:c++接口不使用bool改为BOOL或者int等......
答案就在这里:C#调用C++的dll问题
----------------------Hi,地球人,我是问答机器人小S,上面的内容就是我狂拽酷炫叼炸天的答案,除了赞同,你还有别的选择吗?

0
LEOXI82
LEOXI82 这个不是我想要的答案。。。
接近 4 年之前 回复

先看下,c++下和c#下结构体大小是否有差异,c#下默认4字节对齐

0

已解决。。。。。。。。。(*^__^*) 嘻嘻……

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
将C语言编译成DLL并用C#进行调用以及关于从C#传输中文路径到C的DLL中打开文件的问题
动态链接库(Dynamic Link Library 或者 Dynamic-link Library,缩写为 DLL),是window系统的基石。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 文件中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。从语言方面来说就是可以在一定程度上使不同的语言之间实现相互调用。
C# 调用C dll文件,无法加载问题
如图在VS中直接引用添加时出现错误。需要直接将dll添加到项目生成的exe同一个文件夹下,或者在Import时采样绝对路径或相对路径方式。
C#调用C函数(DLL)传递参数问题
备忘: 1.C函数参数为字符串char*。如果是入参,对应C#中string或StringBuilder;如果是出参对应C#中StringBuider;   2.C函数参数为结构体指针,需在C#中对应定义结构体。如果是入参,C#中可为myfunction(MyStruct mystruct)或myfunction(ref MyStruct mystruct);如果是出参,C#中为
c#调用c语言dll,形参有char*
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.W
JNI调用C#的dll
解决问题的思路 JNI不能直接调用C#的dll,原因是C#没有导出函数,C#的本地方法不能被java加载 可以使用C++做一个桥接,通过C++将C#的dll封装,java再调用C++的dll,即 :java →C++ wrapper → C# 遇到的问题及解决方案 网上有很多这方面的教程,但是中间有很多坑,没有讲明白,会导致很多错误。 jni public class TestJN
DLL函数中内存分配及释放的问题
DLL函数中内存分配及释放的问题 最近一直在写DLL,遇到了一些比较难缠的问题,不过目前基本都解决了。主要是一些内存分配引起问题,既有大家经常遇到的现象也有特殊的 情况,这里总结一下,做为资料。 错误现象是“其原因可能是堆被损坏,这也说明 **.exe 中或它所加载的任何
C#(Csharp)调用C++编写的DLL动态链接库方法详解(含实例)
经常会用到C#(Csharp)调用C++编写的DLL(动态链接库)。由于C#(Csharp)是.NET框架下的托管代码,而C++一般都采用非托管代码,这样调用起来就会出现类型转换、释放资源等问题,该文档详细介绍了C#(Csharp)调用C++编写的DLL(动态链接库)的方法。很不错哦,和大家分享:)
C#委托实现C++ Dll中的回调函数
很多的Dll都是C和C++写的,那么如果C#想要调用Dll中的函数怎么办,尤其是Dll函数其中一个参数是函数指针的,即里面有回掉函数的用C#怎么实现? C中的回掉函数在C#中有中特殊的处理方式叫委托,即要实现的回掉函数委托给另一个和它返回值类型以及函数参数类型、数量一样的方法来实现。 一、新建项目Visual C++  Win32控制台应用,工程名为CcreateDll,解决方案名为
c++调用c#的dll + 实例
c++调用c#的dll + 实例 一、使用/clr编译MFC可执行文件或规则C# DLL函数.     1、打开“项目属性”对话框,方法是右键单击“解决方案资源管理器”中的项目并选择“属性”。     2、展开“配置属性”旁边的节点并选择“常规”。在右侧窗格中的“项目默认值”下,将“公共语言运行库支持”设置为“公共语言运行库支持(/clr)”。     3、在相同的窗格中,确保将“
c#调用c的dll
  一、将C#工程和C的dll工程放在同一个解决方案下,这样就可以实现联动调试,直接从C#中进入C的dll函数里。注意:每次更改dll中的代码后都必须重新生成dll。另,C#与C中有几种变量类型不对应,注意声明时的区分。 语言 C# C 类型 long long long/__int64 byte/Byte unsigned char char ...
C#调用带结构体指针的C Dll的方法
在C#中调用C(C++)类的DLL的时候
C# 调用C/C++ DLL库的回调函数
1、在 C/C++端 定义一个函数指针 Typedef void (*TESTBACK)(int a, int b); 定义一个带函数指针的函数 __declspec(dllexport int add(TESTBACK ptsTestBack, int a, int b) { return ptsTestBack(a, b); } 2、C# 端 声明回调函数的委
C#调用C/C++ DLL 参数传递和回调函数的总结
Int型传入: Dll端: extern "C" __declspec(dllexport) int Add(int a, int b) {     return a+b; } C#端: [DllImport("aeClient2.0.dll", CallingConvention =CallingConvention.Cdecl)]
c# 调用c库dll 遇到char*转string的解决办法
最近由于有个未知的设备需要用到modbus通讯协议,底层需要与PLC通讯,坤跌,PLC啥型号也不清楚封在里面不能拆,前人只留了几个不能运行的QT代码以及不完整的文档。用惯了C#想要重新学QT,真不知猴年马月能完成项目。于是乎找了一个开源的基于C语言开发的modbus库,撸起袖子干了起来。撸代码的过程中,遇到调用c 库的char*转c#的string多次不成功的情况,各种冒框啊,折腾了大半天才算解决...
C#调用DLL的几种方法,包括C#调用C\C++\C#DLL
C#中dll调用方法 一、      DLL与应用程序 动态链接库(也称为DLL,即为“Dynamic Link Library”的缩写)是Microsoft Windows最重要的组成要素之一,打开Windows系统文件夹,你会发现文件夹中有很多DLL文件,Windows就是将一些主要的系统功能以DLL模块的形式实现。 动态链接库是不能直接执行的,也不能接收消息,它只是一个
C# 调用VC Dll (传出参数char*)
vc dll 中的声明 HCLISDK int   __stdcall Fuck(char* szFuck);   其中char* szFuck是从dll内传出的参数。 则在C#中的声明是         [DllImport("HCliSdk.dll", EntryPoint = "Fuck")]         public static extern int Fuck(Strin
调用非托管DLL参数问题
c# 调用非托管DLL参数问题调用非托管DLL参数调用非托管DLL参数问题
C#调用C的Dll(类型对照)
转: C#调用C的Dll(类型对照) //C++中的DLL函数原型为   //extern "C" __declspec(dllexport) bool 方法名一(const char* 变量名1, unsigned char* 变量名2)   //extern "C" __declspec(dllexport) bool 方法名二(const unsigned char* 变量名1, ch
c# 调用 c++ DLL 的各种问题
本文非完全 每种编程语言调用DLL的方法都不尽相同,在此只对用C#调用DLL的方法进行介绍。首先,您需要了解什么是托管,什么是非托管。一般可以认为:非托管代码主要是基于win 32平台开发的DLL,activeX的组件,托管代码是基于.net平台开发的。如果您想深入了解托管与非托管的关系与区别,及它们的运行机制,请您自行查找资料,本文件在此不作讨论。
怎样在C#中调用Delphi6写的DLL
我在编写一个系统时遇到了一个问题,无法在C#中调用Delphi6写的DLL,只因为DLL的参数是string类型的。然后在网上找相关的资料,还是没有结果。经过我的再三琢磨,现在已经解决,特写此文章与大家分享我的喜愉!  Dellphi DLL文件:  ///////////////////////////////////////////////////////////////////  li
c# 调用c++ dll库的几个坑
Q1.报错System.BadImageFormatException  HResult=0x8007000B  Message=未能加载文件或程序集“RotPlatformControl.cs, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。试图加载格式不正确的程序。原因为系统编译环境目标平台与dll库文件的环境不...
C#调用C++生成的DLL,并返回结构体引用或者结构体指针多个值
C#调用C++生成的DLL,并返回结构体引用或者结构体指针多个值 目录 C#调用C++生成的DLL,并返回结构体引用或者结构体指针多个值 步骤1:首先新建C#工程,如图所示 步骤2:解决方案里添加C++工程 步骤3:用C#项目调用C++创建DLL 步骤1:首先新建C#工程,如图所示 创建完后,整体效果如下 步骤2:解决方案里添加C++工程 ...
c#调用C/C++ DLL,传入指针数组(指针指向自定的结构体)
来源:http://bbs.csdn.net/topics/380165851 依靠以下文章:解决问题。 、、、、、、、、、、、、、、、、、、、、 可以用Marshal.StruectToPtr哦。 、、、、、、、、、、、、、、 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
C#调用C/C++ DLL方式总结
C#与C/C++ DLL交互方式总结 C#调用C/C++ DLL导出 C/C++的导出函数: int __stdcall AFunc(wchar_t* str) { //ugsdifgoisuhfgiosugdtfuywegouy return 0; } C#声明: [DllImport("xxxx.dll", CharSet = CharSet.Unicode, C...
C# 释放C++DLL 中申请的内存空间
问题描述:C#调用C++的dll,传入一组数据,返回处理后的数据以及一些信息字段。但是,返回的内容是不定长的,也就是dll内部要进行动态内存申请。那么问题来了,C#怎么接收一个大小不确定的变量?使用完这些数据后,怎么在C#里面释放其内存? 前一个问题的危险是,该段内存的大小,调用方事先是未知的不能进行初始化,这可能会导致缓冲区溢出问题。目前的解决方法只能够是调用方预先分配一个足够大的内存空间
VS2010产生C的dll方法和C#调用方式
第一部分:产生C的dll   1、 1,新建win32工程,选中DLL项目,如下图: 2,分别添加头文件和cpp文件 ? 1 2 3 4 5 6 7 // CDLL.h头文件 #ifndef LIB_H #define LIB_H extern "C" _
C#调用C语言DLL文件示范
C#调用C语言DLL文件示范 C#调用C语言DLL文件示范 C#调用C语言DLL文件示范
C#调用C(C++)dll示例教程,包含dll找不到函数入口的解决办法,包含C#dll调用方式不对出错的解决办法
本篇文章为了熟悉在C#环境下如何调用C(C++)写的dl
在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试
在VS2015中用C++创建DLL并用C++或C#调用且同时实现对DLL的调试
C#调用C写的DLL二级指针传递方法
最近在做一项目需要调用第3方DLL(c写的),其中有个参数是2级指针,查了很多资料终于搞定 1、函数原形   方法原式:   int Quest_goodsA(CHAR* flowno ,CHAR* salesman,int offlinenum,CHAR* offlinegoods,int onlinenum,CHAR* onlinegoods,CHAR** password,CHAR**
VS2012 C语言dll文件生成和C#调用
用C#做Web项目时,需要使用C实现的加密算法,将加密算法封装成dll文件以便在C#中调用,第一次使用dll,做个简单记录。 1. 在需要调用的函数前面添加 __declspec(dllexport)。 使2.用命令行生成dll,使用VS2012的命令行工具,“开始”中找到“Microsoft Visual Studio 2012”,然后“Visual StudioTool
C++ 调用C#工程的 dll , 互相调用方法
很多时候在项目中需要通过C++调用C#的dll,或者反过来条用。 首先明白一个前提:C#是托管型代码。C++是非托管型代码。 托管型代码的对象在托管堆上分配内存,创建的对象由虚拟机托管。(C# )        非托管型代码对象有实际的内存地址,创建的对象必须自己来管理和释放。(C++) 两者详细区别阅读我的另一篇:托管代码和非托管代码的介绍,以及在这区别下的混合调试方法 1、C#调
Demo: c/c++动态库(DLL)调用,c#等其他语言调用c/c++的DLL
c++动态库调用另一个动态库 c++动态库调用c动态库 c#等其他语言调用c/c++动态库
C#调用C/C++的DLL实现字符串的传递
环境:VS2013 C/C++端:新建项目>> Visual C++ >> Win 32 控制台应用程序,后面注意选择 DLL、空项目。然后新建一个C/C++源程序文件,完成的DLL需要处理的功能,如:int dlltest(char *str, char *ans){……}str作为传入的字符串,ans作为传回的字符串,因内存实际在C#调用端分配,提供内存引用。 新建...
将C#程序与调用的dll对应的C++源码联调的一种方法
本方法对满足以下条件的程序有效(放宽版本条件应该也可以,怕误导,所以仅总结说明我使用的条件) 1、有生成dll的源代码,且源代码为用VS编写的C++ 2、dll放在C#工程的Debug文件夹下,并在C#程序中调用了dll 3、要将随dll一同生成的pdb文件一并拷贝到C#工程的Debug文件夹下。这里有必要解释一下pdb文件的重要性      在由C或C++编写的源码生成dll时会同时生成
c# 调用c库dll ,char*转string的解决办法
最近由于有个未知的设备需要用到modbus通讯协议,底层需要与PLC通讯,坤跌,PLC啥型号也不清楚封在里面不能拆,前人只留了几个不能运行的QT代码以及不完整的文档。用惯了C#想要重新学QT,真不知猴年马月能完成项目。于是乎找了一个开源的基于C语言开发的modbus库,撸起袖子干了起来。撸代码的过程中,遇到调用c 库的char*转c#的string多次不成功的情况,各种冒框啊,折腾了大半天才算解决...
C#调用C函数(DLL)传递参数问题
备忘: 1.C函数参数为字符串char*。如果是入参,对应C#中string或StringBuilder;如果是出参对应C#中StringBuider;   2.C函数参数为结构体指针,需在C#中对应定义结构体。如果是入参,C#中可为myfunction(MyStruct mystruct)或myfunction(ref MyStruct mystruct);如果是出参,C#中为
C#中调用C++的dll的参数为指针类型的导出函数(包括二级指针的情况)
一:首先什么是IntPtr 先来看看MSDN上说的:用于表示指针或句柄的平台特定类型。这个其实说出了这样两个事实,IntPtr 可以用来表示指针或句柄、它是一个平台特定类型。对于它的解释,这个哥们写的比较好:It's a class that wraps a pointer that is used when calling Windows API functions. The unde
DLL动态库嵌套跨级调用问题
在应用过程中,动态库调用动态库是常见操作。其在理论上可行,实施也相对简单,调用层次关系如下: App主程序---(同目录)--->DLL_A------(同目录)----->DLL_B&DLL_C 图1 调用层次关系 针对图1所示的应用,应对的方法如下:将DLL_B、DLL_C和DLL_A一起放在主App程序同一目录下即可正常调用。 但是,有时候主控App程序只允许DL...
c++封装dll供c#调用
在合作开发时,C#时常需要调用C++DLL,当传递参数时时常遇到问题,尤其是传递和返回字符串是,现总结一下,分享给大家: VC++中主要字符串类型为:LPSTR,LPCSTR, LPCTSTR, string, CString, LPCWSTR, LPWSTR等 但转为C#类型却不完全相同。 主要有如下几种转换: 将string转为IntPtr:IntPtr System.
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 关于大数据培训 关于云计算