js-ctypes 学習:文字列データの変換とファイル入出力

2017-03-12 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-11)の記事「SpiderMonkey/js-ctypes 学習」に続いて、
SpiderMonkey の js-ctypes 学習。

今回学習したのは、
ファイルへの出力と、ファイルからの入力。

Win32 API でのファイルアクセス」ページ等を参考にさせて頂いた。


だが、
その前にJavaScriptCの間での文字列の変換
が必要だった。

kernel32.dllにある「WriteFile」関数で出力する場合、
第2引数でバッファを指定する。
この時、
・宣言時は'ctypes.char.ptr'として、
・実行時は例えば、
 「var str = 'hohohoge\nNew Line\n';」と2行分を用意し、
 そのまま、「str」と書けば出来る。

だが、
読み込む場合は同じkernel32.dllにある
「ReadFile」関数の第2引数で指定するのは C の文字配列。
例えば
  var Buf = ctypes.char.array(257)();

これを JavaScript の文字列に変換する方法は?

ドキュメントを良く読むと、
Working with data ページの
Working with strings

に載っていた:

  var str = Buf.readString();

でした。


結果、完成したコード(書き出し):
/******** file_Wt.js ********/
var fname = 'xxx.txt';
var libK = ctypes.open( 'kernel32' );
var CreateFile = libK.declare( 'CreateFileA', ctypes.winapi_abi, ctypes.int32_t,
ctypes.char.ptr, ctypes.uint32_t, ctypes.int32_t, ctypes.int32_t,
ctypes.int32_t, ctypes.int32_t, ctypes.int32_t );
var fp = CreateFile( fname, 0x40000000, 0, 0, 2, 0x80, 0 );
print( fp ); // 念の為の確認

var str = 'hohohoge\nNew Line\n'; // 書き出す文字列
var SZ = ctypes.int32_t(1);
var fwrite = libK.declare( 'WriteFile', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t, ctypes.char.ptr, ctypes.int32_t,
ctypes.int32_t.ptr, ctypes.int32_t );
var ret =fwrite( fp, str, str.length, SZ.address(), 0 );
print( ret ); // 念の為の確認
print( SZ.value ); // 実際に書き出されたバイト数
var fclose = libK.declare( 'CloseHandle', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t );
var ret = fclose( fp );
print( ret ); // 念の為の確認
libK.close();
となった。

読み込み場合のコード:
/******** file_Rd.js ********/
var fname = 'xxx.txt';
var libK = ctypes.open( 'kernel32' );
var CreateFile = libK.declare( 'CreateFileA', ctypes.winapi_abi, ctypes.int32_t,
ctypes.char.ptr, ctypes.uint32_t, ctypes.int32_t, ctypes.int32_t,
ctypes.int32_t, ctypes.int32_t, ctypes.int32_t );
var fp = CreateFile( fname, 0x80000000, 0, 0, 3, 0, 0 );
print( fp ); // 念の為の確認

var Buf = ctypes.char.array(257)();
var SZ = ctypes.int32_t(1);
var fread = libK.declare( 'ReadFile', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t, ctypes.char.ptr, ctypes.int32_t,
ctypes.int32_t.ptr, ctypes.int32_t );
var ret =fread( fp, Buf, 256, SZ.address(), 0 );

print( ret ); // 念の為の確認
print( SZ.value ); // 実際に読み込まれたバイト数
str = Buf.readString();
print( str );

var fclose = libK.declare( 'CloseHandle', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t );
var ret =fclose( fp );
print( ret ); // 念の為の確認
libK.close();
となった。


本日はここまで。


SpiderMonkey ( JavaScript/js-ctypes ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170211
関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
06 | 2017/07 | 08
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク