js-ctypes 学習:msvcrt.dll 利用( fopen、_popen )

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

Win32API の“kernel32.dll”、“user32.dll”が使えたので、
今度は、Win32API の親戚?“msvcrt.dll”に挑戦。

msvcrt とは→CRT ライブラリの機能

このライブラリには、fopen とか、fread 関数等がある。

それで、主なもの4つを MSDN でチェックした:
FILE* fopen( const char* filename, const char* mode );
int fclose( FILE* stream );
size_t fread( void* buffer, size_t size, size_t count, FILE* stream );
size_t fwrite( const void* buffer, size_t size, size_t count, FILE* stream );
これらを使って、

先日(2017-03-12)の記事「js-ctypes 学習:文字列データの変換とファイル入出力
で書いた、“file_Wt.js”、“file_Rd.js”を書き換えてみた。

今回は1本のプログラムで、読み込みと書き出し:
// ----- file_IO_msvcrt.js -----
var libC = ctypes.open( 'msvcrt' );

var fopen = libC.declare( 'fopen', ctypes.winapi_abi, ctypes.uint32_t,
ctypes.char.ptr, ctypes.char.ptr );
var fclose = libC.declare( 'fclose', ctypes.winapi_abi, ctypes.uint32_t,
ctypes.uint32_t );
var fread = libC.declare( 'fread', ctypes.winapi_abi, ctypes.uint32_t,
ctypes.uint8_t.ptr, ctypes.int32_t, ctypes.int32_t , ctypes.uint32_t );
var fwrite = libC.declare( 'fwrite', ctypes.winapi_abi, ctypes.uint32_t,
ctypes.char.ptr, ctypes.int32_t, ctypes.int32_t , ctypes.uint32_t );
// ----------
var IN = fopen( 'yyy.txt', 'r' );
print( IN ); // 念の為

var Buf = ctypes.uint8_t.array(257)();
var SZ = fread( Buf, 1, 256, IN );
print( SZ ); // 確認
var str = Buf.readString();
print( str ); // JavaScript の文字列
// ----------
var OT = fopen( 'zzz.txt', 'w' );
print( OT ); // 念の為

var str = 'HOGEHOGE\nNew Line\n';
var SZ = fwrite( str, 1, str.length, OT );
print( SZ ); // 確認
// ----------
var ret = fclose( IN ); print( ret );
var ret = fclose( OT ); print( ret );

libC.close(); var str = readline();
こんな感じ


更に、msvcrt には、_popen 関数もあった。
そうすると、
昨年11月(2016-11-25)の記事「Lua から gnuplot 利用の方式」で書いた、
  ・・・・・
  ・・・・・
  即ち、
  一々「plt」ファイルを作ってからそれを実行する
  のでは無くて、
  即時に gnuplot を動かす。
  これは、
  GP = io.popen( 'gnuplot -persistent', 'w' )
  で、gnuplot をオープンして(立ち上げて)おいて、
  「plt」ファイルに書き込む様に、“GP”ファイルに書き込む。
  ・・・・・
  ・・・・・
この部分に対応して、
_popen”を使って、gnuplot が使える?

やってみた:
// ----- gnuplot_popen_msvcrt.js -----
var libC = ctypes.open( 'msvcrt' );

var popen = libC.declare( '_popen', ctypes.winapi_abi, ctypes.uint32_t,
ctypes.char.ptr, ctypes.char.ptr );
var fputs = libC.declare( 'fputs', ctypes.winapi_abi, ctypes.int32_t,
ctypes.char.ptr, ctypes.uint32_t );
var fclose = libC.declare( 'fclose', ctypes.winapi_abi, ctypes.int32_t,
ctypes.uint32_t );

var gp = popen( 'gnuplot -persistent', 'w' );
print( gp ); // 念の為

var ret = fputs( 'plot sin(x)\n', gp ); // ===== グラフ表示
print( ret ); // 念の為

var ret = fclose( gp );
libC.close(); var str = readline();
これでは、“fwrite”の代わりに“fputs”を使ってみた。
出来た。


やはり、Win32API 直接より、コーディングが楽?


本日はここまで。


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


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


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

コメントの投稿

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

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



おきてがみ

最新記事
カレンダー
10 | 2017/11 | 12
- - - 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 - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

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

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


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

Google Analytics
ブックマーク