c # неуправляемый PInvoke AccessViolation

У меня есть C ++ DLL.
При вызове метода из этой DLL в C # AccessViolation было бросать.
Что в моем коде не так? Кто-нибудь может мне помочь?
Часть заголовка C ++:

typedef PVOID X_HANDLE;
XREADER_API BOOL ReaderOpen(X_HANDLE *pxHandle);
XREADER_API BOOL ReaderReceiveW26(X_HANDLE xHandle, LPVOID pBuffer, DWORD nBufferSize);

Рабочий пример, часть C ++:

X_HANDLE hReader;
unsigned char xKeyBuffer[3];
ReaderOpen(&hReader);
ReaderReceiveW26(hReader,xKeyBuffer,sizeof(xKeyBuffer));

Мой код C #:

[DllImport("reader.dll", CallingConvention = CallingConvention.Cdecl, SetLastError = true)]
public static extern bool ReaderOpen(IntPtr reference);
[DllImport("reader.dll", CallingConvention = CallingConvention.Cdecl, SetLastError = true)]
public static extern bool ReaderReceiveW26(IntPtr hReader, IntPtr pBuffer, uint xKeyBuffer);
static void Main(string[] args)
{
byte[] received = new byte[3];
IntPtr unmanagedPointer = Marshal.AllocHGlobal(received.Length);
Marshal.Copy(received, 0, unmanagedPointer, received.Length);
IntPtr hReader = Marshal.AllocHGlobal(sizeof(uint));
var qqq = uint.Parse((Marshal.SizeOf(typeof(byte)) * received.Length).ToString());
ReaderOpen(hReader);
while (true)
{
if (ReaderReceiveW26(hReader, unmanagedPointer, qqq))

{
Console.WriteLine("!");
}
}
}

Бросок AccessViolation в ReaderReceiveW26 (hReader, unmanagedPointer, qqq)

Спасибо тебе за твое терпение!

0

Решение

Благодаря комментарию Hast Passant!
Если мы хотим использовать IntPtr или что-то, что редактируется неуправляемым кодом, нам нужно использовать

out paramName

Для PVOID мы можем передать реальный тип c #.

Рабочий пример:

[DllImport("reader.dll", CallingConvention = CallingConvention.Cdecl, SetLastError = true)]
public static extern bool ReaderOpen(out IntPtr reference);
[DllImport("reader.dll", CallingConvention = CallingConvention.Cdecl, SetLastError = true)]
public static extern bool ReaderReceiveW26(IntPtr hReader, byte[] pBuffer, uint xKeyBuffer);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]