2

所以 C++ 不是我的强项,所以很可能我在创建结构类型时犯了一个错误,我不太明白如何创建 C++ 代码在 js 端所期望的等效返回类型。

这是来自 C++ 的一个工作示例:

    IO_PVHandle pvHandle;
    IO_EErrorType eError;
    IO_SArgBlockParam suArgBlock;

    pvHandle = connect("COM7");

    if (pvHandle == NULL)
    {
        return -1;
    }

    {
        INT8U au8Data[256];
        IO_SpecificData *psuSpecData = (IO_SpecificData *)au8Data;

        /* setup Argblock */
        suArgBlock.pu8ArgBlock = au8Data;
        suArgBlock.u16ArgBlockLength = 0;
        suArgBlock.u16ArgBlockLengthMax = sizeof(au8Data);

        eError = IO_eGetSpecificData(pvHandle, &suArgBlock);

    }

这是 IO_SpecificData 类型:

typedef struct IO_SpecificData
{
    INT16U u16ArgBlockID; /**< \brief big endian, */
    INT16U u16VendorID; /**< \brief big endian */
    INT32U u32MasterID; /**< \brief big endian */
    INT8U u8MasterType;
    INT8U u8Features_1;
    INT8U u8Features_2;
    INT8U u8MaxMumberOfPorts;
    // PortTypes
}IO_SpecificData;

和 IO_SArgBlockParam 类型:

pu8ArgBlock points to the data. u16ArgBlockLength is used to tell the recipient the used length of the ArgBlock.
u16ArgBlockLengthMax defines the maximum length of the ArgBlock and can be bigger than u16ArgBlockLength, if a bigger answer is expected.
*/
typedef struct IO_SArgBlockParam
{
    INT8U *pu8ArgBlock; /**< \brief Data Buffer (Can be NULL if u16ArgBlockLengthMax = 0) */
    INT16U u16ArgBlockLength; /**< \brief Used length of pu8ArgBlock */
    INT16U u16ArgBlockLengthMax; /**< \brief Total Mem Length of pu8ArgBlock */
    INT16U u16ExpRefArgBlockId; /**< \brief Expected Response or referenced ArgBlock Id (0 = not used) */
}IO_SArgBlockParam;

我没有编写 C++,所以我不确定它为什么会这样。

这是我在 js 方面所做的,(我尝试过的众多版本之一)。我创建了上面定义的结构类型的两个等价物,如下所示:

    IO_SpecificData: StructType({
        'u16ArgBlockID': ref.types.uint16,
        'u16VendorID': ref.types.uint16,
        'u32MasterID': ref.types.uint32,
        'u8MasterType': ref.types.uint8,
        'u8Features_1': ref.types.uint8,
        'u8Features_2': ref.types.uint8,
        'u8MaxNumberOfPorts': ref.types.uint8
    }),
    IO_SArgBlockParam: StructType({
        'u16ArgBlockLength': ref.types.uint16,
        'u16ArgBlockLengthMax': ref.types.uint16,
        'u16ExpRefArgBlockId': ref.types.uint16
    }),

您可能会注意到我缺少 IO_SArgBlockParam 中的 *pu8ArgBlock。那是因为我现在正尝试在方法调用中逐步构建结构,如下所示。

首先这里是我设置 dll 和方法的地方:

        let ArgBlockParam = ref.refType(DataStructure.IO_SArgBlockParam);

        this.DLL = ffi.Library(
            dllLocation,
            {
                /* USB interface management functions */
                'connect': [LONG, [STRING]],
                'IO_eGetSpecificData': [LONG, [LONG, ArgBlockParam]],
            });

这是方法调用本身:

    IO_eGetSpecificData(handle)
    {
        let struct = DataStructure.IOLM_SMI_SArgBlockParam;
        struct.defineProperty('pu8ArgBlock', ref.refType(DataStructure.IO_SpecificData));
        let argBlock = new struct({pu8ArgBlock: new Buffer(256), u16ArgBlockLength: 0,  u16ArgBlockLengthMax: 256, u16ExpRefArgBlockId: 0});
        console.log("calling", handle);
        let resultCode = this.DLL.IO_eGetSpecificData(handle, argBlock.ref());
        console.log("result code", resultCode);
        let result = new DLLFunctionsResultObject(resultCode);
        return result;
    }

它运行时我没有收到任何错误,它似乎永远不会退出方法调用。我尝试了几种不同的选择,我认为我所做的没有任何明显的错误。connect 函数可以工作,但只要有任何东西需要 IO_SArgBlockParam 返回类型,它就不起作用。我显然犯了一个错误。如果有人知道如何解决这个问题,我将不胜感激。

编辑:忘了提,这是在电子子进程上运行的。当它在主进程上运行时,它会杀死 Electron 并返回此“进程以退出代码 -1073741819 (0xC0000005) 完成”。

4

0 回答 0