簡體   English   中英

C#P /調用void **指針傳遞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM