|
■No27177 (オショウ さん) に返信 > と言うことは、間違ってる?
なにがどう間違ってるのが何なのかわかりませんが、 Interface社のラッパーが、ということでしたら微妙なところです。
> [DllImport("gpc43042.dll")] > public static extern int GpibReceive(int ulBoardNo, int[] lpAdrsTbl, ref uint dwpLength, out byte pvBuffer);
こんな風に定義されていますので、これを使うならdwpLength=1にして呼び出さないといけません。 当然、最大1バイトしか取得できません。 殆ど役にはたちませんので、宣言する必要がわかりませんが、一応動きます。
> public static extern int GpibReceive(int ulBoardNo, int[] lpAdrsTbl, ref uint dwpLength, byte[] pvBuffer);
こっちはoutもrefも着いていませんが、動作します。 byte[]はBlittableの配列なので、呼び出し時にはpvBufferは固定されます。 固定されたバッファがgpc43042.dll内部で変更されているので、 .Net側で見ると変更されてるように見えます。 Inパラメーターなのに値が帰ってきていいのか、という問題はありますが、動くことは動きます。
で、最後に、今回問題になっている > public static int GpibReceive(int ulBoardNo, int[] lpAdrsTbl, ref uint dwpLength, out string pvBuffer) これはIFCGPIB.csで定義されている関数で、dll内の関数ではありません。 GpibReceive( ... , Byte[] pvBuffer)の単純なラッパーで、 エラー処理とか文字コードの問題を除けば、まぁ動きます。
なので、Interface社のラッパーにも難点はありますが、 今回の問題はそれが原因である、というわけではありません。
■No27167 (初心者 さん) に返信 > nRet = IFCGPIB.GpibReceive(nBoardNo, DevAdrsTbl, ref RecvLen, out RecvBuffer); > > この部分にミスありそうですかね… > 何度にらめっこしてもわかりません…
この部分に直接のミスはないと思います。 前述のようにIFCGPIB内部のGpibReceive( ... , out String pvBuffer)の定義も、 細かい点を除けば問題ありません。
> 「if(nRet != 0) 」 > で途切れてしまっています。
まずはnRetが何を返しているのか、それが何を示すのかを調べるのがよいと思います。 バグがあったらまずエラーコードを見るというのは基本ですし。
|