2011-02-08 96 views
2


我試圖從C#調用C函數。
下面是從C頭文件中的函數:幫助在C#中編寫C函數#

int __stdcall GetImageKN (unsigned short *ndat); 

而從關於此功能的文檔:

ndat:
灰度圖像 數據獲取緩衝器的指針。
使用 應用程序始終保護 範圍圖像存儲區域。
的 範圍圖像數據存儲區域的大小應爲:
160’ 120「2 = 38400字節
的 灰度被返回爲8位,用於 從7位加倍。

如何調用此函數並讀取圖像數據?
感謝,
SW

回答

2

30KB是一個小緩衝區。如果你的函數跑得快,你可以依靠的默認封送處理行爲,做到這一點:

[DllImport ("your.dll")] 
extern int GetImageKN (short[] ndat) ; 

var buffer = new short[160 * 120] ; 
var result = GetImageKN (buffer) ; 

即使它可以阻止長一段時間,你可以逃脫這個,如果你不叫很多這個功能線程一次。

1
[DllImport ("your.dll")] 
extern int GetImageKN (IntPtr ndat); 

可能會做......

編輯

一般指針表示爲IntPtr的。 您可以創建一個管理的陣列和元帥它的IntPtr,

+0

但是應該傳遞一個數組的地址給函數。如何可以`ndat`代表這樣一個數組? – Vlad 2011-02-08 19:01:57

+0

ndat是輸出,我如何從IntPtr中讀取數組值? – 2011-02-08 19:07:38

+0

@Weis:它看起來像ndat是你傳入的參數,如果你期望函數修改它,你可以用[Out]屬性修飾它,並且它將被修改。完成後,您還可以將其歸還到託管陣列。請訪問pinvoke.net瞭解如何使用它的大量示例。 – Alex 2011-02-08 19:15:21

0
ushort ndat= 123; 

GetImageKN(ref ndat); 
1

我會嘗試以下方法:但是

[DllImportAttribute("your.dll", CallingConvention=CallingConvention.StdCall)] 
extern int GetImageKN(
    [Out, MarshalAs(UnmanagedType.LPArray, SizeConst=38400)] ushort[] ndat); 

不太清楚。