我試圖從C#調用C函數。
下面是從C頭文件中的函數:幫助在C#中編寫C函數#
int __stdcall GetImageKN (unsigned short *ndat);
而從關於此功能的文檔:
ndat:
灰度圖像 數據獲取緩衝器的指針。
使用 應用程序始終保護 範圍圖像存儲區域。
的 範圍圖像數據存儲區域的大小應爲:
160’ 120「2 = 38400字節
的 灰度被返回爲8位,用於 從7位加倍。
如何調用此函數並讀取圖像數據?
感謝,
SW
我試圖從C#調用C函數。
下面是從C頭文件中的函數:幫助在C#中編寫C函數#
int __stdcall GetImageKN (unsigned short *ndat);
而從關於此功能的文檔:
ndat:
灰度圖像 數據獲取緩衝器的指針。
使用 應用程序始終保護 範圍圖像存儲區域。
的 範圍圖像數據存儲區域的大小應爲:
160’ 120「2 = 38400字節
的 灰度被返回爲8位,用於 從7位加倍。
如何調用此函數並讀取圖像數據?
感謝,
SW
30KB是一個小緩衝區。如果你的函數跑得快,你可以依靠的默認封送處理行爲,做到這一點:
[DllImport ("your.dll")]
extern int GetImageKN (short[] ndat) ;
var buffer = new short[160 * 120] ;
var result = GetImageKN (buffer) ;
即使它可以阻止長一段時間,你可以逃脫這個,如果你不叫很多這個功能線程一次。
[DllImport ("your.dll")]
extern int GetImageKN (IntPtr ndat);
可能會做......
編輯
一般指針表示爲IntPtr的。 您可以創建一個管理的陣列和元帥它的IntPtr,
ushort ndat= 123;
GetImageKN(ref ndat);
我會嘗試以下方法:但是
[DllImportAttribute("your.dll", CallingConvention=CallingConvention.StdCall)]
extern int GetImageKN(
[Out, MarshalAs(UnmanagedType.LPArray, SizeConst=38400)] ushort[] ndat);
不太清楚。
但是應該傳遞一個數組的地址給函數。如何可以`ndat`代表這樣一個數組? – Vlad 2011-02-08 19:01:57
ndat是輸出,我如何從IntPtr中讀取數組值? – 2011-02-08 19:07:38
@Weis:它看起來像ndat是你傳入的參數,如果你期望函數修改它,你可以用[Out]屬性修飾它,並且它將被修改。完成後,您還可以將其歸還到託管陣列。請訪問pinvoke.net瞭解如何使用它的大量示例。 – Alex 2011-02-08 19:15:21