Как получить результат от указателя пустого указателя в C # P / Invoke - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь написать оболочку C # вокруг библиотеки свечей Windows, и я застрял в этой функции:

typedef void* candle_list_handle;

DLL bool __stdcall candle_list_scan(candle_list_handle *list);

Вот что я пробовал:

        [DllImport("candle_api.dll", CallingConvention = CallingConvention.StdCall)]
        public static extern bool candle_list_scan(ref IntPtr listPtr);

        public candle_list_t? Scan()
        {
            IntPtr ptr = new IntPtr();
            var res = candle_list_scan(ref ptr);

            var list = Marshal.PtrToStructure<candle_list_t>(ptr);


            if (res)
            {
                return list;
            }
            else
                return null;
        }

Я тоже пробовал:

        [DllImport("candle_api.dll", CallingConvention = CallingConvention.StdCall)]
        public static extern bool candle_list_scan(ref IntPtr listPtr);

        public candle_list_t? Scan()
        {
            IntPtr ptr = new IntPtr();
            var res = candle_list_scan(ref ptr);

            var list = Marshal.PtrToStructure<candle_list_t>(ptr);

            if (res)
            {
                return list;
            }
            else
                return null;
        }

Но ни один из них не работал должным образом. Вот код C, где он устанавливает список:


bool __stdcall candle_list_scan(candle_list_handle *list)
{
    if (list==NULL) {
        return false;
    }

    candle_list_t *l = (candle_list_t *)calloc(1, sizeof(candle_list_t));
    *list = l;
    if (l==NULL) {
        return false;
    }
....

, а список_вечей:


typedef struct {
    uint8_t num_devices;
    candle_err_t last_error;
    candle_device_t dev[CANDLE_MAX_DEVICES];
} candle_list_t;

который я преобразовал в


    public struct candle_list_t
    {
        public byte num_devices;
        public candle_err_t last_error;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
        public candle_device_t[] dev;
    }

Используя мой первый метод, значение num_devices имеет значение, но оно недопустимо, поскольку оно превышает предел, который может быть в num_devices для кода в библиотеке C. Используя второй метод, я просто получаю пустую структуру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...