[英]C# P/Invoke void** pointer pass
我正在使用DllImport用C ++編寫的WINAPI dll訪問USB ADC / DAC轉換器值。 唯一的問題是:
long ZGetBufferADC(long typeDevice, long numberDSP, void **buffer, long *size)
我已經翻譯成
[DllImport("Zadc.dll")]
public static extern Int32 ZGetBufferADC(Int32 typeDevice, Int32 numberDSP, out IntPtr buffer, out Int32 size);
我這樣稱呼這個功能
Int32 err = ZGetBufferADC(typeDevice, numberDSP, out pBuffer, out sizeBufferADC);
然后我需要像在C ++中那樣在C#中訪問生成的pBuffer:
short *pBuffer16ADC = (short*) pBuffer
volt0 = resolutionADC0 * (pBuffer16ADC[pointerADC]) / amplifyADC0;
其中pointerADC是指向ADC轉換器當前值的Int32,我設法正確地將其解決了問題
所以我該如何在C#中實現該結構呢? 我試圖像這樣定義變量
IntPtr pBuffer;
Int16 pBuffer16ADC;
pBuffer16ADC = (Int16)pBuffer;
volt0 = resolutionADC0 * (pBuffer16ADC[pointerADC]) / amplifyADC0;
但這會引發錯誤
Cannot apply indexing with [] to an expression of type 'short'
任何幫助將不勝感激! 如果需要其他信息,請詢問我將盡快提供。 這個問題使我幾乎瘋了一個星期:(謝謝!
size
可能以字節為單位。 相反,如果size
是元素的數量,那么如何適應以下內容應該是顯而易見的。
首先,在執行操作時調用該函數:
Int32 err = ZGetBufferADC(typeDevice, numberDSP, out pBuffer, out sizeBufferADC);
然后聲明一個要將緩沖區復制到的數組。
short[] buffer = new short[sizeBufferADC/Marshal.SizeOf(typeof(short))];
最后復制緩沖區:
Marshal.Copy(pBuffer, buffer, 0, buffer.Length);
那應該就是您所要做的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.