DllImport ссылки

Рейтинг: 0Ответов: 1Опубликовано: 17.05.2023

Подскажите, не могу разобраться с подключеним сторонней библиотеки. Имеется 2 метода. SPNXREADER_API BOOL SpnxReaderOpen(SPNX_HANDLE *pxHandle); pxHandle - указатель куда будет записана ссылка на устройство

SPNXREADER_API BOOL SpnxReaderReceiveW26(SPNX_HANDLE pxHandle, LPVOID pBuffer, DWORD nBufferSize);

pxHandle - указатель из первого метода. pBuffer - указатель на буфер куда будет записаны полученные данные nBufferSize - Длина буфера.

У меня не получается разобраться со вторым методом, как в него правлиьно передать массисв

[DllImport("spnxreader.dll", CharSet = CharSet.Unicode)]
public static extern Boolean SpnxReaderOpen(Int32* SPNX_HANDLE);
[DllImport("spnxreader.dll", CharSet = CharSet.Unicode)]
public static extern void SpnxReaderClose(Int32* SPNX_HANDLE);
[DllImport("spnxreader.dll", CharSet = CharSet.Unicode)]
public static extern Boolean SpnxReaderReceiveW26(Int32* SPNX_HANDLE, ref String buffer, Int32 nBufferSize);

private void Form1_Load(object sender, EventArgs e)
{
    Int32 s;
    var t = SpnxReaderOpen(&s);
    while (true)
    {
      
        byte[] buf = new byte[3];
        var xr = SpnxReaderReceiveW26(&s, ref buf , 3);
    }
    SpnxReaderClose(&s);

}

Получаю ошибку Необработанное исключение типа "System.AccessViolationException" Как пример есть рабочий код на С++. но не могу понять в чем проблема.

int _tmain(int argc, _TCHAR* argv[])
{
    SPNX_HANDLE hReader;
    unsigned char xKeyBuffer[3];

    // Открываем считыватель

    if ( SpnxReaderOpen(&hReader) != TRUE )
    {
        printf( "Unable to open the reader. Device is probably disconnected, disabled or driver is not installed.\n" );
        return 0;
    }

    // Получаем от считывателя коды карт и распечатываем их.

    for(;;)
    {
        if ( SpnxReaderReceiveW26(hReader,xKeyBuffer,sizeof(xKeyBuffer)) != TRUE )
        {
            // Произошка ошибка. Вероятно, устройство отключили от USB.
            printf( "Communication error. Device is probably disconnected.\n" );
            return 0;
        }

        printf( "%03d,%05d\n", (unsigned)(xKeyBuffer[0]), (unsigned)(xKeyBuffer[1])*0x100 + xKeyBuffer[2] );
    }
}

Ответы

▲ 0Принят

Немного перемудрили, маршаллирование типов как раз и нужно для того чтобы не мучиться с указателями и небезопасным кодом.

[DllImport("spnxreader.dll", CharSet = CharSet.Unicode)]
public static extern bool SpnxReaderOpen(out IntPtr handle);
[DllImport("spnxreader.dll", CharSet = CharSet.Unicode)]
public static extern void SpnxReaderClose(IntPtr handle);
[DllImport("spnxreader.dll", CharSet = CharSet.Unicode)]
public static extern bool SpnxReaderReceiveW26(IntPtr handle, byte[] buffer, int bufferSize);

private void Form1_Load(object sender, EventArgs e)
{
    if (!SpnxReaderOpen(out IntPtr handle))
        return;
    while (true)
    {
        byte[] buffer = new byte[3];
        if (!SpnxReaderReceiveW26(handle, buffer, buffer.Length))
            break;
    }
    SpnxReaderClose(handle);
}