C#调用C++dll,返回值为结构体,结构体值转换不对

sinat_28980305 sinat_28980305 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
C++dll的方法为 LPECWATCHDATA WINAPI ecwGetExternsionData(WORD widx);
LPECWATCHDATA是这样定义的
typedef struct {
WORD nState; //状态
WORD nIdx; //索引
WORD wDataCnt; //数据(lpData)项数
char szTime[20]; //时间
unsigned char* lpIDString; //设备号码
unsigned char* lpNameString; //设备/用户名称
LPCTSTR lpData[8];
}ECWATCHDATA,*LPECWATCHDATA;

我在C#里是这样转的 ECWATCHDATAeds = (ECWATCHDATA)(Marshal.PtrToStructure(ecwGetExternsionData(i), typeof(ExteECWATCHDATA))); ExternsionDataStruct是我自己定义的一个结构体,结构体为
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential, CharSet = System.Runtime.InteropServices.CharSet.Ansi)]
public struct ECWATCHDATA
{

/// WORD->unsigned short
public ushort nState;

/// WORD->unsigned short
public ushort nIdx;

/// WORD->unsigned short
public ushort wDataCnt;

/// char[20]
[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst = 20)]
public string szTime;

/// char*
public IntPtr lpIDString;

/// char*
public IntPtr lpNameString;

/// char*[8]
[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst = 8, ArraySubType = System.Runtime.InteropServices.UnmanagedType.SysUInt)]
public System.IntPtr[] lpData;
}
ECWATCHDATAeds = (ECWATCHDATA)(Marshal.PtrToStructure(ecwGetExternsionData(i), typeof(ECWATCHDATA))); 转化C#的结构体后里面有的值不对。像lpIDString,lpNameString和实际值对不上,这是什么原因?
...全文

相关推荐

基于C#调用c++Dll结构体数组指针的问题详解

下面小编就为大家分享一篇基于C#调用c++Dll结构体数组指针的问题详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

weixin_38599412

C#调用C++dll 结构体参数传递问题

1、最近做项目遇到,C#调用C++dll里的函数需要传递结构体参数,发现这个并不是简单的在C#里定义相应的结构体就可以的,下面以一个例子来说明解决的办法,C++中的函数和结构体如下: uint msec_set_igr_gen_cfg(int port, IGR_GEN_T *igr_gen) { return 0; } typedef struct {   i

sundk911

C#调用C++DLL数组,结构体传递

C#调用C++DLL数组,结构体传递 本文例子是C#静态引用C++DLL的一维数组,通过结构体传递的方式。已验证。 二维数组也可以通过结构体传递的方式传递,方法二维数组先转换成一维数组,然后按照下述。这里不多做表述,有需要请参看下一篇文章。(还没顾得上写) 照猫画虎。 例子实现功能:Sn=a+bn(n>=0) 即Sn[0]=S0=a+b0, Sn[1]=S1=a+b1, Sn[2]=S2=a+b2 … C++DLL .cpp中 void _cdecl addTest(GetSn &&s

独处红楼的小猪崽

C#调用C++封装成DLL的结构体及类

C#调用C++封装成DLL的结构体及类

debuggers_0506

C++调用C#的DLL实例程序

C++调用C#的DLL实例程序,压缩包中包含部分程序说明,很小的几行代码,但是C++调用C#的DLL目的已经达到。

canhui2009
评论 12
收藏 已收藏
分享
返回顶部
sinat_28980305
C# 111,128 成员 642,536 内容