2

Cライブラリのラッパーを作成しようとしていますが、このエラーに本当に苦労しています。

私は多くのアプローチを試しましたが、そのうちの1つを次に示します。

    [DllImport(DRIVER_FILENAME)]
    [return: MarshalAs(UnmanagedType.U4)]
    private static extern uint GetData(IntPtr handle,
        [MarshalAs(UnmanagedType.LPArray), In()] int[] buffer,
        [MarshalAs(UnmanagedType.U4)] uint size);

ライブラリドキュメントの関数GetDataは次のとおりです。

LONG GetData( 
  IN HANDLE Handle,
  OUT PULONG Buffer, 
  IN ULONG Size
); 

関数は、サイズがバイト単位で指定されているバッファに連続データ(約16KB /秒)を返します。バッファint[16384]です。私のコードは次のようになります:

public static uint GetLibData(IntPtr handle, int[] buffer, uint size)
    {
        size *= 4;            
        uint sizeRead = GetData(handle, buffer, size);

        sizeRead /= 4;

        return sizeRead;
    }

問題のある引数はバッファです。以前はIntPtrbufferPtrなどの他の方法で管理してから、 Marshal.AllocHGlobalによってメモリを割り当てようとしましたが、同じエラーが発生していました。

保護されたメモリの読み取りまたは書き込みを試みました。これは多くの場合、他のメモリが破損していることを示しています。

この関数を正しく呼び出す方法は?

4

2 に答える 2

1

適切な p/invoke 宣言は次のとおりです。

[DllImport(DRIVER_FILENAME)]
private static extern uint GetData(
    IntPtr handle,
    [Out] uint[] buffer,
    uint size
);

関数を呼び出す前にバッファを割り当てるのはあなたの責任です:

uint[] buffer = new uint[16384];
uint bufferSize = buffer.Length*Marshal.SizeOf(typeof(uint));
uint sizeRead = GetData(handle, buffer, bufferSize);
uint lenRead = sizeRead/Marshal.SizeOf(typeof(uint));

100% 明確ではない唯一のことは、呼び出し規約です。このライブラリは、あなたがすべきことcdeclを意味するものを使用していると思いますDllImport

[DllImport(DRIVER_FILENAME, CallingConvention=CallingConvention.Cdecl)]
于 2013-01-18T20:47:59.597 に答える
0

次のPInvokeを試してください。

[DllImport(DRIVER_FILENAME)]
private static extern Int32 GetData
(
    [In] IntPtr handle,
    [Out] out IntPtr buffer,
    [In] UInt32 size
);
于 2013-01-18T18:17:53.337 に答える