2009-03-25 6 views
4
で、このDelphiの機能をマッピングする方法を

私は、次のDelphiの機能を持っている:私はJNA

function DoX(const InputBuffer: Pointer; const InputBufferSize: longword; OutputBuffer: Pointer; var OutputBufferSize: longword): longbool; 

出力バッファとOutputBufferSizeのかどうかを示すboolean型の戻りで、結果の一部として機能で設定されますメソッドが成功しました(InputBuffer & OutputBufferはバイト配列になります)。

私はJNAとDLLからの私に必要な機能の一部をマッピングするために管理していると、彼らは[OK]を働いている、しかし、この1つは私に問題を与えている、任意の助けいただければ幸いです。

答えて

5

ほとんどJNAドキュメントでは、C、いないデルファイを使用していると仮定し、そのための機能をCと同等で始まる:

int DoX(const void* InputBuffer, 
     unsigned int InputBufferSize, 
     void* OutputBuffer, 
     unsigned int* OutputBufferSize); 

あなたはまた、右の呼び出し規約を取得したいと思います。 Delphiのデフォルトはレジスタです。これはおそらくあなたが望むものではありません。代わりにstdcallを使用してください。それは他のすべてのDLLが使用するものです。

Javaには、使用しているものと同等の符号なしタイプがありません。したがって、unsignedを無視して開始してください。これにより、InputBufferSizeintとなります。あなたの関数はブール値を返すので、戻り値の型としてbooleanを使用してください。 JNAはByReferenceクラスの子孫を介して基準によって種類を渡すサポートしているため、OutputBufferSizeためIntByReferenceを使用しています。

最後にポインタです。あなたはバイト配列だと言いました。なぜ私はあなたがDelphiコードでそのように宣言しないのか困惑しています。 PByteを使用するか、新しいPByteArray型を宣言して使用してください。 (この変更は、はるかに便利その機能を実現するようになります。)Javaでは、バイト配列としてそれらを宣言してみてください。だから、最終製品:

boolean DoX(byte[] InputBuffer, 
      int IntputBufferSize, 
      byte[] OutputBuffer, 
      IntByReference OutputBufferSize);