Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将指向C结构的指针发送到C++;动态链接库 在DLL中有一个C++函数,它使用一个指向结构的指针,JPnFo,函数中填充了从服务器接收的数据,C++结构的布局如下: typedef struct JP { unsigned char type; DWORD value; } JP; typedef struct JPInfo { JP jps[3]; _int16 ConT; _int16 CallT; unsigned char ret; unsigned char count; unsigned char JPOffset; unsigned char JPPeriod; } JPInfo;_C#_C++_Dll_Pinvoke - Fatal编程技术网

C# 将指向C结构的指针发送到C++;动态链接库 在DLL中有一个C++函数,它使用一个指向结构的指针,JPnFo,函数中填充了从服务器接收的数据,C++结构的布局如下: typedef struct JP { unsigned char type; DWORD value; } JP; typedef struct JPInfo { JP jps[3]; _int16 ConT; _int16 CallT; unsigned char ret; unsigned char count; unsigned char JPOffset; unsigned char JPPeriod; } JPInfo;

C# 将指向C结构的指针发送到C++;动态链接库 在DLL中有一个C++函数,它使用一个指向结构的指针,JPnFo,函数中填充了从服务器接收的数据,C++结构的布局如下: typedef struct JP { unsigned char type; DWORD value; } JP; typedef struct JPInfo { JP jps[3]; _int16 ConT; _int16 CallT; unsigned char ret; unsigned char count; unsigned char JPOffset; unsigned char JPPeriod; } JPInfo;,c#,c++,dll,pinvoke,C#,C++,Dll,Pinvoke,函数在DLL中导出,如下所示: __declspec(dllexport) DWORD __stdcall GetJPInfo(JPInfo* jpi, DWORD time); 该函数获取指向JPInfo结构的指针,我已经尝试在C中模拟该结构# 我尝试从C#调用函数,如下所示: 我得到一个类型为“System.ExecutionEngineeException”的未处理异常。我的JPInfo结构中没有固定大小的JP结构数组,所以我不知道如何处理这个问题 谢谢。您是否尝试过删除结构上的大小属性

函数在DLL中导出,如下所示:

__declspec(dllexport) DWORD __stdcall GetJPInfo(JPInfo* jpi, DWORD time);
该函数获取指向JPInfo结构的指针,我已经尝试在C中模拟该结构#

我尝试从C#调用函数,如下所示:

我得到一个类型为“System.ExecutionEngineeException”的未处理异常。我的JPInfo结构中没有固定大小的JP结构数组,所以我不知道如何处理这个问题


谢谢。

您是否尝试过删除结构上的大小属性?在做类似的事情时,我不必指定尺寸。对于数组属性,请尝试对其进行如下属性设置:

[StructLayout(LayoutKind.Sequential)]
public struct JPInfo
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    JP[] jps;
    Int16 ConT;
    Int16 CallT;
    byte ret;
    byte count;
    byte JPOffset;
    byte JPPeriod;
}

<>假设C++结构被打包,你的C结构应该是这样的:

[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct JP
{
    byte type;
    uint value;
}

[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct JPInfo
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst=3)]
    JP[] jps;
    Int16 ConT;
    Int16 CallT;
    byte ret;
    byte count;
    byte JPOffset;
    byte JPPeriod;
}
另一方面,如果未打包,则将
Pack
参数删除到
StructLayout
属性。在C++头文件中,应该查找<代码> > PraceMaPARCUT//COD>语句,以了解C++结构是否被打包。 <>我猜想C++结构是打包的,因为你说它们映射到从服务器接收到的数据。 您的导入应该是这样的:

[DllImport("DLLImp.dll")]
public static extern uint GetJP(ref JPInfo jpi, uint time);

DWORD
转换为
uint
而不是
int
,这里不需要不安全的代码。

尽量不要明确指定sie,默认的封送员会执行这些操作。(Size=23,5等)嗯,我现在没有收到错误,但是结构没有被填充,在DLL中执行直接逐字节复制,因此结构中项目的顺序至关重要,我声明结构中的成员在内存中的顺序是否相同?是的,这是一种方法。我还将在创建时初始化数组,执行
JP[]jps=newjp[3]。通过指定LayoutKind.Sequential,内存将按照您在.NET应用程序中定义结构属性的顺序进行布局。拥有动态数组大小对我来说没有意义,因为您必须通过管道发送精确的内存分配。@Krizz为什么需要这样做?pinvoke marshaller将使用默认值初始化,这样就不需要您概述的步骤。绝对完美!谢谢你,大卫。
[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct JP
{
    byte type;
    uint value;
}

[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct JPInfo
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst=3)]
    JP[] jps;
    Int16 ConT;
    Int16 CallT;
    byte ret;
    byte count;
    byte JPOffset;
    byte JPPeriod;
}
[DllImport("DLLImp.dll")]
public static extern uint GetJP(ref JPInfo jpi, uint time);