• C# Struct to delphi packed record


    I have a function extracted from a delphi dll

    function func_name(par1: Byte; par2: struct1) : boolean

    Struct 1 is made up of :

    struct1 = packed record
        Number: Byte;
        arrStr : array[1..8] of struct2;
    end

    Moreover struct2 is made up of:

    struct2 = packed record
        Code: Byte;
        Price: Single;
    end

    Now using C# i am trying to pass a same time of structure to delphi using the following

    First i created my structures:

    [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
    public struct struct2
    {
        public byte code;
        public Single price;
    }
    
    [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
    public struct struct1
    {
        public byte Number;
    
        [MarshalAs(UnmanagedType.LPArray)]
        public struct2[] Prices;
    
        public struct1(int elements)
        {
            Number = 0;
            arrStr = new struct2[elements];
        }
    }

    Note elements is always 8.

    So when i try to run the code thus filling the array and passing it to the function i get the following error:

    Invalid managed/unmanaged type combination (Array fields must be paired with ByValArray or SafeArray)."

    The array is inline in the struct. It is not a pointer. So instead of

    [MarshalAs(UnmanagedType.LPArray)]

    you must use

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
  • 相关阅读:
    各种编译器
    C99特性
    动态内存分配
    MDK C++编程说明
    C++类的大小计算
    WPF DataGrid添加编号列
    WPF实现打印用户界面功能
    WPF DataGrid 导出Excel
    知识点总结
    Winfrom控件使用
  • 原文地址:https://www.cnblogs.com/cinemaparadiso/p/12159554.html
Copyright © 2020-2023  润新知