2016-01-20 61 views
0

我有C++ DLL。 在C#AccessViolation中從此DLL調用的方法被拋出時。 我的代碼中有什麼錯?有人能幫我嗎? C++頭部分:c#unmanaged PInvoke AccessViolation

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)投擲

謝謝你的耐心!

+1

你傳遞的第一個參數是廢話,你應該先調用ReaderOpen(),並使用返回的IntPtr。它的聲明是錯誤的,該參數是'out IntPtr'。 ReaderReceiveW26()的第二個參數應該是'byte []'。 –

回答

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);