2011-02-08 12 views
2


C#からC関数を呼び出そうとしています。Help C#でC関数をマーシャリングする

int __stdcall GetImageKN (unsigned short *ndat); 

、この機能に関するドキュメントから:

ndat:グレースケール画像の
ポインタバッファを取得 データここ
はCヘッダファイルから関数です。
アプリケーションプログラムを使用して、範囲イメージ格納領域 を常に保護してください。
距離画像データ記憶領域の大きさがなければならない:
160’ 120「2 = 38400バイト
階調は、7ビットから倍増していることを8ビットとして返されます。

この機能を呼び出して画像データを読み取るにはどうすればよいですか?
おかげで、

答えて

2

30KBは小さなバッファである、のIntPtrに管理されているアレイと元帥それを作成することができます。あなたの関数はすぐに実行している場合は、デフォルトのマーシャリングの動作に依存し、これを行うことができます。

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

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

それは長い時間のためにブロックすることができたとしても、あなたは多くの上で、この関数を呼び出していない場合、あなたはこれで逃げることができます一度にスレッド。

+0

必要はありません:[MarshalAs(UnmanagedType.LPArray)] –

+0

いいえ、これはデフォルトの動作であるためです。 –

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

はおそらく行います
SW ...

EDIT

一般的にポインタがのIntPtrとして表現されています。 あなたは

+0

しかし、関数の配列のアドレスを渡す必要があります。 'ndat'はどのようにそのような配列を表現できますか? – Vlad

+0

ndatが出力されている場合、IntPtrから配列値を読み取るにはどうすればよいですか? –

+0

@Weis:あなたが渡しているパラメータがndatのように見えますが、関数を変更すると予想される場合は、[Out]属性でそれを修飾すると修正されます。完了したら管理された配列に戻すこともできます。それを使用する方法の例のトンのためのpinvoke.netに行く。 – Alex

0
ushort ndat= 123; 

GetImageKN(ref ndat); 
+0

これは、管理されたヒープ-1を破損します。 –

1

私は次のことをしようとするだろう:

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

本当にわからないが。

関連する問題