Преобразование C # в C void*

#c# #c #void #intptr

#c# #c #недействительно #ввод

Вопрос:

Я новичок в C #, и меня попросили создать код на C #, который использует C DLL.

Функциям из C DLL требуется параметр void *, поэтому я отправляю IntPtr параметр из кода C #.

Но в конце этой функции мой указатель, похоже, NULL . Я что-то упускаю?

Вот мой код на C #:

 int somme = 0;
IntPtr deviceHandle = new IntPtr();
uint[] SpiConf = new uint[7];
somme = Opening(deviceHandle, SpiConf);
if (deviceHandle == IntPtr.Zero)
{
    Console.WriteLine("deviceHandle is NULL"); // 
}
  

И вот моя функция из C DLL:

 int Opening(void* deviceHandle, unsigned char SpiConf[])
{
    wchar_t devPath;
    unsigned long devPathsize = 0;
    unsigned short VID = 0x4d8;
    unsigned short PID = 0xde;
    int res;

    deviceHandle = Mcp2210_OpenByIndex(VID, PID, 0, amp;devPath, amp;devPathsize);
    res = Mcp2210_GetLastError();
    if (res != E_SUCCESS)
    {
        //Console.WriteLine("Failed to open connection");
        return -1;
    }
    if (deviceHandle == NULL)
    {
        return -2;
    }
    return 0; // This function returns 0
}
  

Буду очень признателен за любую помощь.

Комментарии:

1. Не следует ли вам также опубликовать сигнатуру P / Invoke Opening метода?

2. Как выглядит ваш [DllImport] метод?

3. @MTA Пожалуйста, не форматируйте не-код, такой как «C #» и «C DLL», как код.

4.@kalimag @UweKeim Привет, вот мой метод [DllImport] : [DllImport("Spi_Functions.dll", CallingConvention = CallingConvention.Cdecl)] public static extern int Opening(IntPtr deviceHandle, uint[] SpiConf);

5. Глядя на код C , я полагаю, что при выходе значение вашего C # deviceHandle останется неизменным. «deviceHandle = Mcp2210_OpenByIndex(…)» изменит только локальную (стековую) копию того, на что указывается, — это не изменит исходный параметр или то, на что указывал исходный параметр. Вам нужно будет передать ссылку на указатель или указатель на указатель, чтобы изменить фактически переданный параметр указателя.