0

JSCTypes を使用して JavaScript から DLL にアクセスしています。次の API に文字バッファーを渡してデータを受信する必要がありますが、

__declspec(dllexport) WORD WINAPI receive( LPWORD  lpwBufferSize,
                                           LPSTR   lpsBuffer);

私のjsctypesは次のようになります。

let receive = libs.dll.declare("receive",
                               ctypes.stdcall_abi,  
                               ctypes.int32_t,           // Return type - return code
                               ctypes.int32_t.ptr,       // buffer size
                               ctypes.char.ptr,          // Buffer
                               );
var bufferSize = new ctypes.int32_t(3000000).address(); //3000000
var buffer = new ctypes.char().address();
let rvopen = receive(bufferSize, buffer);
return buffer.readString()

上記のコードで、最初は正しくデータを受信できましたが、2 回目以降の受信関数呼び出しで xulrunner がクラッシュします。Windowsで利用可能な一般的なDLLを使用して、この問題を再現しようとしました。これにより、キャッチされない例外がスローされます: TypeError: ctypes.char.array(500).address is not a function

var hostName = exports.getString = function() {
    let lib = ctypes.open('Ws2_32.dll');
    let gethostname = lib.declare("gethostname",
                                  ctypes.default_abi,
                                  ctypes.int,
                                  ctypes.char.ptr,
                                  ctypes.int);
    var myArray = ctypes.char.array(500).address();
    gethostname(myArray, 500);
    return myArray.readString();
};

アドレス API 呼び出しをドロップして、以下のように試してみると、

var myArray = ctypes.char.array(64);

C++ 配列はポインターと見なされますが、この問題に遭遇します。

「キャッチされていない例外: TypeError: 予想される型ポインター、ファイル内の ctypes.char.array(640000) を取得しました」行 0、列 0

dll のソース コードにアクセスできません。DLL のインクルード ファイル (.h) しかありません。私は Java 開発者ですが、ソース コードなしでデバッグできるかどうかわかりません。

4

2 に答える 2

1

やっと解決策が見つかり、

<code>
 let charArray= ctypes.ArrayType(ctypes.char);
 let myArray = new charArray(500);      
</code>

関数プロトタイプは同じです

于 2011-08-07T14:57:34.077 に答える
0

推測する必要がある場合は、バッファーを適切なサイズに割り当てる必要があると言えます。多分:

var buffer = new ctypes.char().array(3000000).address();

「受信」関数にブレークポイントを設定したデバッガーを使用して、JS から渡されるデータを確認してください。

于 2011-08-05T03:34:28.300 に答える