Как правильно проанализировать IntPtr для объекта в C # при маршалинге из C ++ - PullRequest
0 голосов
/ 27 июня 2019

Я вызываю функцию C ++ из C #.
Функция, которую я пытаюсь вызвать, возвращает следующий результат типа структуры C ++:

LPWFSCIMNOTETYPELIST lpNoteTypeList;

typedef struct _wfs_cim_note_type_list
{
    USHORT usNumOfNoteTypes;
    LPWFSCIMNOTETYPE *lppNoteTypes;
} WFSCIMNOTETYPELIST, *LPWFSCIMNOTETYPELIST;

typedef struct _wfs_cim_note_type
{
    USHORT usNoteID;
    CHAR cCurrencyID[3];
    ULONG ulValues;
    USHORT usRelease;
    BOOL bConfigured;
} WFSCIMNOTETYPE, *LPWFSCIMNOTETYPE;

Я нашел подходящую структуру в C #:

[StructLayout(LayoutKind.Sequential, Pack = XFSConstants.STRUCTPACKSIZE, CharSet = CharSet.Ansi)]
public unsafe struct WfsCimNoteType
{
    public ushort usNoteID;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    public char[] cCurrencyID;

    public uint ulValues;
    public ushort usRelease;
    public byte bConfigured;
}

[StructLayout(LayoutKind.Sequential, Pack = XFSConstants.STRUCTPACKSIZE, CharSet = CharSet.Ansi)]
public unsafe struct WfsCimNoteTypeList
{
    public ushort usNumOfNoteTypes;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
    public WfsCimNoteType[] lppNoteTypes;
}

Я использовал следующий код для анализа результата из вызванной функции:

WfsCimNoteTypeList data = new WfsCimNoteTypeList(); 
XFSUtil.PtrToStructure<WfsCimNoteTypeList>(lpBuffer, ref data);

(здесь lbBuffer равно IntPtr)

XFSUtil.PtrToStructure определенокак это:

public static void PtrToStructure<T>(IntPtr ptr, ref T p) where T : struct
{
    p = (T)Marshal.PtrToStructure(ptr, typeof(T));
}

Но после анализа массива объектов от IntPtr до WfsCimNoteType я получаю разные значения ???

...