Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.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语言的非托管代码# 我试图用McSalar来获得C++中的工作C++ C++ DLL代码。 它有两个结构,在导出的API中作为指针参数传递,但它在C#中给出的结构响应值顺序不正确。然而,它在VC++中运行良好 //C++ Code - Working //Structure 1 typedef struct { bool bExist; bool bAvailable; int iNoteNumber; int iDispenseNumber; int iOutNoteNumber; char cStatus; char acBoxID[6]; } tHopperStatus; //Structure 2 typedef struct { char acCurrency[4]; int lDenomination; int iRemainCount; int iCount; int iOutCount; int iRejectCount; int iPurgeCount; BYTE byHopper; char cStatus; char cLastStatus; char acBoxID[6]; BYTE byBoxType; char acReserved1[10]; char acReserved2[10]; int iReserverd1; int iReserverd2; } tCashBox; //API using above two structures int iGetCassette(tCashBox* p_psCashBox,tDevReturn* p_psStatus); //Calling API by passing pointer of Structure Array tCashBox l_asBox[8] = {0}; tDevReturn l_asReturn[8] = {0}; int l_iRes = l_pDev->iGetCassette(l_asBox, l_asReturn);_C#_C++_Marshalling - Fatal编程技术网

转换为C++;C语言的非托管代码# 我试图用McSalar来获得C++中的工作C++ C++ DLL代码。 它有两个结构,在导出的API中作为指针参数传递,但它在C#中给出的结构响应值顺序不正确。然而,它在VC++中运行良好 //C++ Code - Working //Structure 1 typedef struct { bool bExist; bool bAvailable; int iNoteNumber; int iDispenseNumber; int iOutNoteNumber; char cStatus; char acBoxID[6]; } tHopperStatus; //Structure 2 typedef struct { char acCurrency[4]; int lDenomination; int iRemainCount; int iCount; int iOutCount; int iRejectCount; int iPurgeCount; BYTE byHopper; char cStatus; char cLastStatus; char acBoxID[6]; BYTE byBoxType; char acReserved1[10]; char acReserved2[10]; int iReserverd1; int iReserverd2; } tCashBox; //API using above two structures int iGetCassette(tCashBox* p_psCashBox,tDevReturn* p_psStatus); //Calling API by passing pointer of Structure Array tCashBox l_asBox[8] = {0}; tDevReturn l_asReturn[8] = {0}; int l_iRes = l_pDev->iGetCassette(l_asBox, l_asReturn);

转换为C++;C语言的非托管代码# 我试图用McSalar来获得C++中的工作C++ C++ DLL代码。 它有两个结构,在导出的API中作为指针参数传递,但它在C#中给出的结构响应值顺序不正确。然而,它在VC++中运行良好 //C++ Code - Working //Structure 1 typedef struct { bool bExist; bool bAvailable; int iNoteNumber; int iDispenseNumber; int iOutNoteNumber; char cStatus; char acBoxID[6]; } tHopperStatus; //Structure 2 typedef struct { char acCurrency[4]; int lDenomination; int iRemainCount; int iCount; int iOutCount; int iRejectCount; int iPurgeCount; BYTE byHopper; char cStatus; char cLastStatus; char acBoxID[6]; BYTE byBoxType; char acReserved1[10]; char acReserved2[10]; int iReserverd1; int iReserverd2; } tCashBox; //API using above two structures int iGetCassette(tCashBox* p_psCashBox,tDevReturn* p_psStatus); //Calling API by passing pointer of Structure Array tCashBox l_asBox[8] = {0}; tDevReturn l_asReturn[8] = {0}; int l_iRes = l_pDev->iGetCassette(l_asBox, l_asReturn);,c#,c++,marshalling,C#,C++,Marshalling,我在C#中实现的是: 我怀疑,在C++中是否允许这样的结构数组传递,C++中的结构是这样工作的。如果有人能在这方面帮助我,那将是一个很大的帮助。提前谢谢 编辑: 我将'ldenamination'的数据类型从long更改为int。现在,数组的第一个元素已正确填充。但是struct数组的其余七个元素没有被填满 如果有人能帮助我,如何创建结构数组,使所有元素按顺序拥有内存。最终通过以下更新的结构2解决了问题: 1.将“LDE”的数据类型从long更改为int。 2.在结构布局参数中添加了Pack=1

我在C#中实现的是:

我怀疑,在C++中是否允许这样的结构数组传递,C++中的结构是这样工作的。如果有人能在这方面帮助我,那将是一个很大的帮助。提前谢谢

编辑: 我将'ldenamination'的数据类型从long更改为int。现在,数组的第一个元素已正确填充。但是struct数组的其余七个元素没有被填满


如果有人能帮助我,如何创建结构数组,使所有元素按顺序拥有内存。

最终通过以下更新的结构2解决了问题: 1.将“LDE”的数据类型从long更改为int。 2.在结构布局参数中添加了Pack=1和CharSet=CharSet.Ansi

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
public struct tCashBox
{
    public tCashBox(int param)
    {
        acCurrency = new char[4];
        lDenomination = 0;
        iRemainCount = 0;
        iCount = 0;
        iOutCount = 0;
        iRejectCount = 0;
        iPurgeCount = 0;
        byHopper = 0;
        cStatus = '\0';
        cLastStatus = '\0';
        acBoxID = new char[6];
        byBoxType = 0;
        acReserved1 = new char[10];
        acReserved2 = new char[10];
        iReserverd1 = 0;
        iReserverd2 = 0;
    }
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    public char[] acCurrency;
    public int lDenomination;
    public int iRemainCount;
    public int iCount;
    public int iOutCount;
    public int iRejectCount;
    public int iPurgeCount;
    public byte byHopper;
    public char cStatus;
    public char cLastStatus;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
    public char[] acBoxID;
    public byte byBoxType;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
    public char[] acReserved1;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
    public char[] acReserved2;
    public int iReserverd1;
    public int iReserverd2;
}

将签名更改为:publicstaticextern int CDM_iGetCassette(out-tCashBox[]现金箱,out…),您不需要不安全的结构。您可以在一个安全的上下文中使用'out'关键字而不是'in,out',这是指针和内存异常@结构的构造函数永远不会被调用。如果将大小添加到StructLayout,则将生成适当大小的结构。e、 为您的第一个结构添加[StructLayout(LayoutKind.Sequential,Size=272,CharSet=CharSet.Ansi)]-添加字符集也是一个好主意。您可能想检查是否在原C++中使用了“Apple PrimaMax包”(如果1),如果需要在结构布局中添加包=1。代码中可能有更多的错误,但是数据类型在C语言中是64位宽的,而它仅在微软的C++编译器中。听起来你真的应该雇佣一个开发者。
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
public struct tCashBox
{
    public tCashBox(int param)
    {
        acCurrency = new char[4];
        lDenomination = 0;
        iRemainCount = 0;
        iCount = 0;
        iOutCount = 0;
        iRejectCount = 0;
        iPurgeCount = 0;
        byHopper = 0;
        cStatus = '\0';
        cLastStatus = '\0';
        acBoxID = new char[6];
        byBoxType = 0;
        acReserved1 = new char[10];
        acReserved2 = new char[10];
        iReserverd1 = 0;
        iReserverd2 = 0;
    }
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    public char[] acCurrency;
    public int lDenomination;
    public int iRemainCount;
    public int iCount;
    public int iOutCount;
    public int iRejectCount;
    public int iPurgeCount;
    public byte byHopper;
    public char cStatus;
    public char cLastStatus;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
    public char[] acBoxID;
    public byte byBoxType;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
    public char[] acReserved1;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
    public char[] acReserved2;
    public int iReserverd1;
    public int iReserverd2;
}