SpiderMonkey 学習:再入門

2017-03-30 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-29)の記事「js-ctypes 学習:IUP でドラッグ&ドロップ」までで、
js-ctypes 学習がそれなりに進んだ。

改めて、
MDN > 開発者向けのWeb技術 > JavaScript > JavaScript ガイド
の、文法とデータ型
  本章では JavaScript の基本構文、変数宣言、データ型と
  リテラルについて説明します。
で学習した。


1.console.log() 関数がある。

  This function is an alias of the print() function.


2.コマンド起動時引数:

  以前の Ver.1.8.5 では、arguments だったが、
  今の Ver.54.0a1 では、scriptArgs

  これは、配列もどき?
  scriptArgs.length とか、scriptArgs[0] とか


3.サブの JavaScript ファイル( SUB.js )を起動できる:

   run( 'SUB.js' );
  これは、
   load( 'SUB.js' );
  と一緒???

  でも、どんなファイルでも出来るわけではない。


4.eval() 関数がある:

   d = eval( 'a=2; b=5; c=(a+b)/2; print(c*3)' ); // print までOK
   print( a, b, c, d ); // d はundefined
  続けて、
   d = eval( 'a*5.4' );
   print( a, d ); // d は正しく 10.8

  eval() は、evaluate() でも一緒。



本日はここまで。


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


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


170226
スポンサーサイト

js-ctypes 学習:IUP でドラッグ&ドロップ

2017-03-29 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-27)の記事「js-ctypes 学習:IUP - Portable User Interface」に続いて、
今度は、
IUPでのドラッグ&ドロップ・コールバック処理
に挑戦。

具体的には、
昨年3月(2016-03-19)の記事「GSL Shell 学習:IUP でドラッグ&ドロップ
に載せたコードをSpiderMonkeyに移植。


出来たコードは:
// ===== convert to '.js' =====
 var WinABI = ctypes.winapi_abi; var CBABI = ctypes.stdcall_abi;
 var VOID = ctypes.void_t; var VoidA = ctypes.voidptr_t;
 var Char = ctypes.char; var CharA = Char.ptr;
 var Uint8 = ctypes.uint8_t; var Byte = Uint8;
 var WORD = ctypes.uint16_t; var DWORD = ctypes.uint32_t;
 var Int32 = ctypes.int32_t;
 var Float = ctypes.float32_t; var Double = ctypes.float64_t;
 var HANDLE = ctypes.size_t; var HWND = HANDLE; var hWnd = HANDLE;
 var BOOL = ctypes.bool;
 var LPARAM = ctypes.size_t; var LPTSTR = ctypes.jschar.ptr;
var Cast = ctypes.cast;
var lib = ctypes.open( 'iup' );

var CB_DnD = ctypes.FunctionType( CBABI, VOID, [ HANDLE, CharA, Int32, Int32, Int32 ] );

var IupOpen = lib.declare( 'IupOpen', WinABI, VOID, Int32 );
var IupClose = lib.declare( 'IupClose', WinABI, VOID );
var IupDialog = lib.declare( 'IupDialog', WinABI, HANDLE, HANDLE );
var IupSetAttributes = lib.declare( 'IupSetAttributes', WinABI, VOID, HANDLE, CharA );
var IupSetCallback = lib.declare( 'IupSetCallback', WinABI, VOID, HANDLE, CharA, CB_DnD.ptr );
var IupPopup = lib.declare( 'IupPopup', WinABI, VOID, HANDLE, Int32, Int32 );

IupOpen( 0 ); // ----- これ必須!!!

function onDnD( Z, F, n, x, y ){
print( Z, n, x, y ); // -------- 数値, 0, x, y
fname = F.readString() // ----- 日本語含むとダメ???
IupClose()
}
var fname;
var dlg = IupDialog( 0 ) // -- 枠だけ
IupSetAttributes( dlg, '"SIZE"="160x120", "TITLE"="DnD here"' )
IupSetCallback( dlg, 'DROPFILES_CB', CB_DnD.ptr(onDnD) )
IupPopup( dlg, 100, 100 )
// -----------------
print( fname ); // -- これで フルパス:「\」セパレート
print( fname.split( '\\' ).slice( 0, -1 ).join( '\\' ) ); // folder 部分
print( fname.split( '\\' ).slice( -1 ) ); // ファイル名部分
var _ = readline();
こんな感じ?

これで、
D&Dでファイル名を得ることが出来る。


関連して今回学習したこと:

1.SpiderMonkey の変数名では、アンダーバー1文字でも可

2.GSL Shell の時、void* で定義していた IupDialog の引数を、
  正しく(?) HANDLE で定義すると利用時がスッキリする。

3.[char*].readString() では、日本語文字がダメ???



本日はここまで。


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


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


170225

js-ctypes 学習:IUP - Portable User Interface

2017-03-27 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-26)の記事「js-ctypes 学習:OpenCV のマウスコールバック処理
に続いて、
今度は、
GSL Shell では
昨年3月(2016-03-13)の記事「GSL Shell 学習:IUP - Portable User Interface」で書いた、
 Lua で GUI アプリを作成するためのクロス プラットフォーム キットIUP
に挑戦。
つまり、
ブログ記事に載せたコードをSpiderMonkeyに移植。


出来たコードは:
// ===== convert to '.js' =====
var VOID = ctypes.void_t; var VoidA = ctypes.voidptr_t;
var Char = ctypes.char; var CharA = Char.ptr
var Int32 = ctypes.int32_t;
var WinABI = ctypes.winapi_abi;

var lib = ctypes.open( 'iup' );

var IupOpen = lib.declare( 'IupOpen', WinABI, VOID, Int32 );
var IupMessage = lib.declare( 'IupMessage', WinABI, VOID, CharA, CharA );
var IupFileDlg = lib.declare( 'IupFileDlg', WinABI, VoidA );
var IupSetAttributes = lib.declare( 'IupSetAttributes', WinABI, VOID, VoidA, CharA );
var IupPopup = lib.declare( 'IupPopup', WinABI, VOID, VoidA, Int32, Int32 );
IupOpen( 0 ); // ----- これ必須!!!

IupMessage( 'test', 'OK?' ); // -- IupMessageDlg のテスト

var filedlg = IupFileDlg(); // -- IupFileDlg のテスト
IupSetAttributes( filedlg, 'DIALOGTYPE = LOAD, TITLE = "File Load"' );
IupSetAttributes( filedlg, 'FILTER = "*.png", FILTERINFO = "PNG Files"' );

IupPopup( filedlg, 0, 0 )
こんな感じ?

なんとか動いた。


本日はここまで。


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


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


170224

js-ctypes 学習:OpenCV のマウスコールバック処理

2017-03-26 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-25)の記事「js-ctypes 学習:KWF_list 関数」で、
Win32API でのコールバック処理の実用的(?)なコードが作れた。

そこで、
先日(2017-03-19)の記事「js-ctypes 学習:cast そして OpenCV」で学習した、
画像処理の決定版(?)OpenCVに依る画像表示窓での
マウスイベントコールバック処理に挑戦。


プログラム内で指定した画像ファイルを読み込んで窓に表示。
この窓内でマウス(カーソル)を移動させたイベントを、
コールバック関数でそのカーソル位置を表示する。

と云ったもの。

出来たコードは:
// ===== mouseCB_CV.js =====
var VOID = ctypes.void_t; var Cast = ctypes.cast;
var Byte = ctypes.uint8_t; var Char = ctypes.char;
var DWORD = ctypes.uint32_t; var Int32 = ctypes.int32_t;
var CBABI = ctypes.stdcall_abi; var WinABI = ctypes.winapi_abi;

var lib = ctypes.open( 'opencv_world300' );

var CvMat = new ctypes.StructType( 'tagCvMat', [
{ 'type': DWORD }, { 'step': DWORD }, { 'refc': DWORD }, { 'hdrr': DWORD },
{ 'data': Byte.ptr }, { 'yy': Int32 }, { 'xx': Int32 } ]);

var CB_mouse = ctypes.FunctionType( CBABI, VOID, [ Int32, Int32, Int32, Int32 ] );

var cvLoadImageM = lib.declare( 'cvLoadImageM', WinABI, CvMat.ptr, Char.ptr, Int32 );
var cvNamedWindow= lib.declare( 'cvNamedWindow', WinABI, Int32, Char.ptr, Int32 );
var cvShowImage = lib.declare( 'cvShowImage', WinABI, VOID, Char.ptr, CvMat.ptr );
var cvWaitKey = lib.declare( 'cvWaitKey', WinABI, Int32, Int32 );
var cvDestroyAllWindows= lib.declare( 'cvDestroyAllWindows', WinABI, VOID );
var cvSetMouseCallback= lib.declare( 'cvSetMouseCallback', WinABI, VOID, Char.ptr, CB_mouse.ptr );

// ====================================
var fname = 'hogehoge.png'
var img = Cast( cvLoadImageM( fname, 0 ), CvMat.ptr ).contents;
var xx=img.xx; var yy=img.yy; var sz = xx * yy;

var BT = Cast( img.data, Byte.array(sz).ptr).contents;

function onmouse( event, x, y, flag ){
if( event == 0 ){ // 0 == cv2.EVENT_MOUSEMOVE
print( event, x, y, flag );
}
}

cvNamedWindow( 'img', 0 );
cvSetMouseCallback( 'img', CB_mouse.ptr(onmouse) );

while( true ){
cvShowImage( 'img', img.address() )
var k = cvWaitKey(50) & 0xFF;
if( k == 27 ){ break; } // esc to exit
}

cvDestroyAllWindows();
lib.close();
こんな感じ?

出来ました。

但し、
マウスを動かす毎にコンソール窓にダラダラ表示されるが。
未だ、学習の身なのでヨシとしよう。


本日はここまで。


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


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


170221

js-ctypes 学習:KWF_list 関数

2017-03-25 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-24)の記事「js-ctypes 学習:コールバック処理」で、
コールバック処理コード
及び、
typedefに相当することや関数の別名定義
を学習した。

題材が、'EnumWindows' だったので、・・・・・

昨年(2016-08-01)の記事「KWF (kami's Window Functions) モジュール」で書いた、
“KWF.lua”モジュールの“KWF.List()”関数相当品を作ってみた。
ほぼ、1体1対応のコードで作れた:
/***** CB_EnumWin_KWF.js *****/
var lib = ctypes.open( 'user32.dll' );

var DWORD = ctypes.uint32_t; var Int32 = ctypes.int32_t;
var HANDLE = ctypes.size_t; var BOOL = ctypes.bool;
var LPARAM = ctypes.size_t; var LPTSTR = ctypes.jschar.ptr;
var CBABI = ctypes.stdcall_abi; var WinABI = ctypes.winapi_abi;
var ArrayT = ctypes.ArrayType; var Cast = ctypes.cast;
/// -----------------------------

var CB_EnumWin = ctypes.FunctionType( CBABI, BOOL, [ HANDLE, LPARAM ] );
var EnumWindows = lib.declare( 'EnumWindows', WinABI, BOOL, CB_EnumWin.ptr, LPARAM );

var IsWindowVisible = lib.declare( 'IsWindowVisible', WinABI, BOOL, HANDLE );
var GetWindowLongA = lib.declare( 'GetWindowLongA', WinABI, Int32, HANDLE, Int32 );
var GetWindowTextW = lib.declare( 'GetWindowTextW', WinABI, Int32, HANDLE, LPTSTR, Int32 );
var GetWindowThreadProcessId = lib.declare('GetWindowThreadProcessId', WinABI, DWORD,
HANDLE, DWORD.ptr );
// ------- 以上宣言部 、以下が関数 -----
function KWF_List(){
var Wcnt = 0; var pIDT = new Array();
var PID = new DWORD; var wnd = LPARAM(0);
var Buf = new new ArrayT( ctypes.jschar, 256 );

var CB_Proc = function( hwnd, l ){
if( IsWindowVisible( hwnd ) ){ // 先ずは、これで絞る。
var h = GetWindowLongA( hwnd, -8 ); // -8 == GWL_HWNDPARENT : 親Windowハンドル
if( h == 0 ){ // 自分が親か?
if( GetWindowTextW( hwnd, Buf, 255 ) > 0 ){
Txt = Buf.readString();
var thr = GetWindowThreadProcessId( hwnd, PID.address() );
pIDT[Wcnt] = new Array( hwnd, Txt, PID.value, thr );
Wcnt++;
}
}
}
return true; //let enum continue till nothing to enum
}

EnumWindows( CB_EnumWin.ptr( CB_Proc ), Cast( wnd.address(), LPARAM ) ); // これメイン
return pIDT;
}
/************* テスト・メイン *********/
var pIDT = KWF_List(); /* ここから開始 */
Wcnt = pIDT.length; print( Wcnt );
for( k=0; k var WinH=pIDT[k][0]; var Txt=pIDT[k][1]; var PID=pIDT[k][2]; var thrd=pIDT[k][3];
print( WinH.toString(16), PID, thrd, Txt );
}
lib.close();
var str = readline();
結果は、以上。
ここで、
テストしていて、
'GetWindowTextA' ではダメだったので 'GetWindowTextW' に代えた。
これでも、まだ日本語のテキストは正しく出ない???


本日はここまで。


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


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


170219

js-ctypes 学習:コールバック処理

2017-03-24 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-22)の記事「SpiderMonkey:バージョンアップ」で、
SpiderMonkey 54.0a1 にバージョンアップした。

それで、js-ctypes 学習を継続。

今回は、コールバック処理のコーディング。

それには、昨年6月、7月、8月の記事で出てくる、
EnumWindows”が最適。
何か良い例が無いか? 探してみた。


Standard OS Libraries」ページには、
  ・・・・・
  ・・・・・
  Windows
  ・・・・・
  ・・・・・
  WinAPI
  ・・・・・
  ・・・・・
  Resources for WinAPI
  ・ GitHubGISTS :: Noitidart / Search・winapi
    - WinAPI js-ctypes snippets that can be copied and ・・・
  ・・・・・
  ・・・・・
とあるので、見に行った。

  We've found 46 gist results

と云うことで、この中にはどうか?


ありました:2ページ目の7番目(17/46 ですね)
  Noitidart / _ff-addon-snippet-WINAPI_GetRunningPids.js”
これが正に欲しいもの。

このコードを“View”ボタンクリックで表示して、
コピー&ペースト。
(ファイルのコードは 'UTF-8' として)
Cu.import(~) と、console.time(~) は、コメント・アウトし、
console.log(~) は、print(~) に変更した。
これで、動作した。

このコードは、“GSL Shell”での、
昨年6月(2016-06-25)の記事「ウィンドウ・ハンドルの取得」に近い???

このコードからコールバック処理以外も学習。

typedefの様な abbreviation 定義が出来る
しかも関数についても別名を定義できる。


そこで、<紙>流に分かり易く(?)書き直してみた:
// ===== sample_CB_EnumWindows.js =====
var lib = ctypes.open( 'user32.dll' );

/********* この様な abbreviation 定義が出来る ******/
var DWORD = ctypes.uint32_t; var HANDLE = ctypes.size_t;
var HWND = HANDLE; var BOOL = ctypes.bool;
var LPARAM = ctypes.size_t; var LPTSTR = ctypes.jschar.ptr;
var CBABI = ctypes.stdcall_abi; var WinABI = ctypes.winapi_abi;
var arrayT = ctypes.ArrayType; var Cast = ctypes.cast; /* 関数もOK */

var E_WinProc = ctypes.FunctionType( CBABI, BOOL, [HWND, LPARAM] ); /* CB 関数型宣言 */

var E_Win = lib.declare( 'EnumWindows', WinABI, BOOL, E_WinProc.ptr, LPARAM );
var GetClassNm = lib.declare('GetClassNameW', WinABI, ctypes.int, HWND, LPTSTR, ctypes.int);

var GetWin_Th_ProcId = lib.declare('GetWindowThreadProcessId', ctypes.winapi_abi,
DWORD, HWND, ctypes.uint32_t.ptr ); // ctypes.uint32_t.ptr == LPDWORD

// ------------------
function getRunningPids(){ //returns array of pids of running firefox instances
var ffPids = {};
var PID = new DWORD;
var buf = new new arrayT( ctypes.jschar, 255 );

var SearchPD = function( hwnd, lParam ){
GetClassNm( hwnd, buf, 255 );
var className = buf.readString();
if (className == 'MozillaWindowClass'){
var rez = GetWin_Th_ProcId( hwnd, PID.address() );
ffPids[PID.value] = 0;
};
return true; //let enum continue till nothing to enum
}
var SearchPD_ptr = E_WinProc.ptr( SearchPD );
var wnd = LPARAM(0);
E_Win( SearchPD_ptr, Cast( wnd.address(), LPARAM ) ); /* これが CB のサンプル */
return Object.keys( ffPids );
}

var pids = getRunningPids(); /*** 開始 ***/
print( 'pids:', pids , pids.length );

lib.close();
var str = readline();
Callback 処理はこの様なコードで!


本日はここまで。


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


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


170218

SpiderMonkey:バージョンアップ

2017-03-22 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
先日(2017-03-08)の記事「JavaScript:SpiderMonkey で行く」では、
4年前(2013-12-15)の記事「SpiderMonkey:JavaScriptインタプリタ」で書いた、
SpiderMonkey Ver 1.6 から、Ver 1.8.5 にアップした。
  Ver 1.6 に比べて、約3倍速?
  WSH の JScript に比べて2.4倍速?
そうは云っても、まだまだ遅いもの。

だが、
js-ctypes なる機能があり:「SpiderMonkey 学習:js-ctypes 入門
非常に気に入っている。

本来の JavaScript の機能には<紙>的には満足している訳では無いが、
気に入っている js-ctypes について、ここまである程度学習した。

後は、処理速度の問題。

現在は、SpiderMonkey 38 ?:SpiderMonkey
いや、SpiderMonkey 45 ?:SpiderMonkey releases

Just-In-Time compiler が目に入った:Internals

どの位速くなるのか?

何とか新しいものを手に入れることが出来ないか???
或いは、自分でビルド出来ないか???


SpiderMonkey Windows binary」検索で、

Qiita の「windows上でSpiderMonkeyコマンドライン環境を構築」を見つけた。
  ソースからコンパイルするのではなく、バイナリを落とせばOK。
  の筈だったのですが、ちょっとはまったのでメモしておきます。

  基本的なやり方はここに書いてあります。
  ・・・・・
  ・・・・・
  1.<URL>(リンク)
  から
  jsshell-win32.zipまたはjsshell-win64-x86_64.zipをダウンロードする。

  2.展開してjs.exeを実行する

  でOKの筈だったのですが、・・・・・
  ・・・・・
  ・・・・・

これは、どうか?

だが、上記リンクは txt ファイル1つ:
  This directory is no longer in use. Please use
   <URL>
  instead.

ダメだ。

そこで、
jsshell-win32」検索を行った。

Directory Listing: /pub/firefox/nightly/latest-mozilla-central/」を見つけた。

ここの下から3番目に、

  File jsshell-win32.zip(リンク)

があったので、
nightlyだけど、これをダウンロードした。

展開のみでOKダ。


早速、Ver.1.8.5 を展開したフォルダ:D:/TOOL/SpiderMonkey/
の3つの代わりに、
展開した、全46ファイルを置いた。
js.exe 以外は45ヶの DLL オンパレード。
バージョンは、54.0a1 進みすぎ!


それで、
例のフィボナッチ数計算のベンチマークでは、・・・

Ver.1.8.5 では、16.6 ~ 18.1 秒で、
GSL Shell の 0.74 秒 に比べて 22.5 ~ 24.4 倍遅い。
(因みに例のサイトには、SpiderMonkey(38.1) 0.537 秒 とある)

これが、なんと 0.408 秒となった。超超高速!!!


但し、
“.js”ファイルは“UTF-8”で保存すべし


これで、大満足? 十分満足? 可成り満足?


更なる、js-ctypes の学習に力が入る???


本日はここまで。


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


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


170217

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

js-ctypes 学習:cast そして OpenCV

2017-03-19 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-18)の記事「js-ctypes 学習:外部プログラムの実行」に続いて、
SpiderMonkey /js-ctypes の学習継続。

今回は、
Tipe casting ( 変換 )について学習。

js-ctypes のドキュメント:
MDN > Mozilla > js-ctypes > Using js-ctypes の、
Working with data」に、
  ・・・・・
  ・・・・・
  Type casting
  You can type cast data from one type to another
   by using the ctypes.cast() function:

  var newObj = ctypes.cast(origObj, newType);

  This will return a new object whose data block is shared
   with the original object, but whose type is newType.
  If the size of the new type is undefined or larger than
   the size of the original object's data block, TypeError is thrown.

  This works very much like a standard C type cast or C++ reinterpret_cast.

即ち(Google翻訳で)

  ctypes.cast()関数を使用すると、あるタイプから別のタイプへの
  キャストデータを入力できます。

  var newObj = ctypes.cast(origObj、newType);

  これは、元のオブジェクトとデータブロックが共有されているが、
  その型がnewTypeである新しいオブジェクトを返します。
  新しい型のサイズが未定義であるか、元のオブジェクトのデータブロックの
  サイズよりも大きい場合は、TypeErrorがスローされます。

  これは、標準のCタイプのキャストやC ++のreinterpret_castと
  非常によく似ています。

まあ、分かるかナ。

続けて、
  Example: Cast an array
  This example shows
  how to cast an array of a certain type to another type.
とある。

これで、学習した:
// バイト配列8要素、値格納:
var B = ctypes.uint8_t.array(8)( [8,7,6,5,4,3,2,1] );
print( B[6], B[7] ); // 念のための確認: 2, 1 最後の2要素

// 上記を、2バイト配列4要素に cast
var I = ctypes.cast( B.address(), ctypes.uint16_t.array(4).ptr).contents;
print( I[3] ); // 0x0102 == 258 で、OK
こんな風に。

更に、構造体への cast は?
// uint32_t 配列7要素、値格納:
var A = ctypes.uint32_t.array(7)( [7,6,5,4,3,2,1] );
print( B[6], B[7] ); // 念のための確認: 2, 1 最後の2要素

// 上記を、構造体に cast
var CvMat = new ctypes.StructType( 'CvMat', [
{ 'type': ctypes.int32_t }, { 'step': ctypes.int32_t },
{ 'refc': ctypes.int32_t }, { 'hdrr': ctypes.int32_t },
{ 'data': ctypes.uint8_t.ptr },
{ 'yy': ctypes.int32_t }, { 'xx': ctypes.int32_t } ]);
var K = ctypes.cast( A.address(), CvMat.ptr ).contents;
print( K.yy, K.xx ); // 2, 1 OK:これで行ける
つまり、要点は、“.contents”を付ける事?
この例は、OpenCV を使いたい為に選んだもの。


実は、今回の学習は、
昨年2月(2016-02-23)の記事「GSL Shell 学習:OpenCV 使えそうダ?」で書いた、
  「opencv_world300.dll」26.3MB 1つ。
この DLL を利用しようと、数日間悪戦苦闘していたことから始まった。

あれこれ悩み&検索していたが、
どうも、cast の問題の様なので、上記の例に至った。

と云うことで、
やってみた:
// ---------- test_OpenCV.js ----------
var lib = ctypes.open( 'opencv_world300' );
var CvMat = new ctypes.StructType( 'CvMat', [
{ 'type': ctypes.uint32_t }, { 'step': ctypes.uint32_t },
{ 'refc': ctypes.uint32_t }, { 'hdrr': ctypes.uint32_t },
{ 'data': ctypes.uint8_t.ptr },
{ 'yy': ctypes.int32_t }, { 'xx': ctypes.int32_t } ]);
var cvCreateMat = lib.declare('cvCreateMat' ctypes.winapi_abi,CvMat.ptr,
ctypes.int32_t, ctypes.int32_t, ctypes.int32_t );

var M = cvCreateMat( 5, 4, 0 ); // rows, cols, type(CV_8U)
var C = ctypes.cast( M, CvMat.ptr ).contents; // これが必要
print( C.type.toString(16), C.yy, C.xx ); // 0x42424000 5 4 OK
ss = C.xx * C.yy
var D = ctypes.cast( C.data, ctypes.uint8_t.array(ss).ptr ).contents;
print( D[0], D[ss-1] ); // 0 0 初期状態なので。エラーじゃ無いからOK?
で使えそう。


結論:
戻り値が構造体の場合は、
直接 CvMat で参照してもダメ?
1度 cast するコト!
それも“.contents”を付ける!


本日はここまで。


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


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


170216

js-ctypes 学習:外部プログラムの実行

2017-03-18 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-17)の記事「js-ctypes 学習:画像ファイルの入力」に続いて、
SpiderMonkey /js-ctypes の学習継続。

今回は、
外部プログラムの実行について。

Luaでは、
昨年3月(2016-03-01)の記事「GSL Shell 学習:外部プログラムの実行」で書いた、
  os.execute

Pythonでは、
3年前(2014-03-10)の記事「Python 学習:system関数?」で書いた、
  subprocess モジュール

Perlでは、
4年前(2013-08-03)の記事「PerlからRを使ってグラフ出力」で書いた、
  system( ) 関数


「Win32API open exe」で検索してみた。
例の“Stack Overflow”の、
winapi - win32 API for running other exe」が真っ先に見つかる。

回答の[2] に、
  The windows CreateProcess API call is what you're looking for: ~~~


「CreateProcess 使い方」で検索したら、
外部プロセスの起動」が見つかる。

  ・・・・・
  ・・・・・
  2.CreateProcess関数
  外部プロセス起動Windows APIとしては WinExec関数がある。

UINT WinExec(
LPCSTR lpCmdLine, // コマンドラインへのポインタ
UINT uCmdShow // ウィンドウの表示状態
);
  第二引数を SW_SHOW とすればコマンドプロンプト画面が表示され、
  SW_HIDE とすれば表示されない。
  しかし、この関数は Windows の以前のバージョンとの互換性のために
  残されているものであり、Win32 アプリケーションでは、
  CreateProcess 関数を使うことが推奨されている。
  下に使用例を示す。CreateProcess関数はWinExec関数より高い機能を持つ
  代わりに、使い方が少々面倒である。
  ・・・・・
  ・・・・・

まあ、
もし使っていいものなら、これで十分ダ。

MSDN:WinExec

内容は、上記参照記事と一緒。

気になるのは、“SW_SHOW”“SW_HIDE”の値。
でも、“SW_SHOW”ダケ知りたい。(“SW_HIDE”は要らない)
これについては、
1月(2017-01-30)の記事「Win32 APIの定数:定義は?」で書いた、
ダウンロードした const.lzh 書庫ファイル にある。
  $00000005
とありました。
つまり、
  0x00000005 == 5
ですネ。

なお、“WinExec”がどの DLL に含まれるのかは、
1月(2017-01-23)の記事「クライアント/サーバ:プロセス間通信」を
書いたときに参照(学習)したサイトの内の
 ・PInvoke.net

これで調べる(検索する)と、“kernel32”とあった。


と云うことで、

1本作った:
// ---------- test_WinExec.js -----
var lib = ctypes.open( 'kernel32' );

var WinExec = lib.declare( 'WinExec', ctypes.winapi_abi, ctypes.uint32_t,
ctypes.char.ptr, ctypes.uint32_t );
var ret = WinExec( 'notepad a.txt', 5 );
print( ret ); // 確認の為

lib.close();
var str = readline();
これで、“メモ帳”が立ち上がって、'a.txt' を開いている。


本日はここまで。


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


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


170215

js-ctypes 学習:画像ファイルの入力

2017-03-17 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-15)の記事「js-ctypes 学習:プロセス間通信の例」に続いて、
SpiderMonkey /js-ctypes の学習継続。

今回は、
昨年1月(2016-01-29)の記事「Lua 学習:IM ( An Imaging Toolkit )」で書いた、
  ・・・・・
  ・・・・・
  “IM”は?・・・“3.10”が 2015-09-18 にリリースされている。
  これに決めよう。
  “Windows”の“Dynamic”の“32ビット版”と云うことで、
  「im-3.10_Win32_dllw4_lib.zip」(2015-09-18付)  1.72MB
  をダウンロードした。
  中には沢山入っているが、
  「im.dll」(1.61MB)1つあれば良さそう?

  「IM」ページの左側:
  “Storage”の“Guide”ページにある例から、( FFI 利用 )
  ・・・・・
  ・・・・・

この「im.dll」を使って画像ファイルの入力処理。

先ずは、
当該ブログ記事のコードを(ほぼそのまま)移植:
// --------------- im_sample.js ----------
var lib = ctypes.open( 'im' );

var imOpen = lib.declare( 'imFileOpen', ctypes.winapi_abi, ctypes.voidptr_t,
ctypes.char.ptr, ctypes.int32_t.ptr );

var fname = 'hogohoge.tiff'
var err = ctypes.int32_t(1);

var IN = imOpen( fname, err.address() );
print( IN, err.value ); // 確認の為

var imInfo = lib.declare( 'imFileReadImageInfo', ctypes.winapi_abi, ctypes.int32_t,
ctypes.voidptr_t, ctypes.int32_t,
ctypes.int32_t.ptr, ctypes.int32_t.ptr,
ctypes.int32_t.ptr, ctypes.int32_t.ptr );
var xx = ctypes.int32_t(1); var yy = ctypes.int32_t(1);
var col = ctypes.int32_t(1); var typ = ctypes.int32_t(1);
var Er = imInfo( IN, 0, xx.address(), yy.address(), col.address(), typ.address() );
print( xx.value, yy.value, col.value, typ.value );

var imClose = lib.declare( 'imFileClose', ctypes.winapi_abi, ctypes.int32_t,
ctypes.voidptr_t );
imClose( IN );

lib.close();
var str = readline();
これで、同じ出力結果が得られた。


それで、データ本体の取得は?・・・

ファイルクローズの前に、以下を追加。

var imRead = lib.declare( 'imFileReadImageData', ctypes.winapi_abi,  ctypes.int32_t,
ctypes.voidptr_t, ctypes.uint8_t.ptr, ctypes.int32_t, ctypes.int32_t );
var Buf = ctypes.uint8_t.array(257)();
Er =imRead( IN, Buf, 0, -1 ); // If flag is -1 the file original flags are used.
確認の為の表示:
print( Buf[0], Buf[xx.value-1], Buf[xx.value*yy.value-1] );
でしょうか?


完璧???


本日はここまで。


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


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


170214

js-ctypes 学習:プロセス間通信の例

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

今回は、
1月(2017-01-23)の記事「クライアント/サーバ:プロセス間通信」で書いた如く、
“GSL Shell”で作った“test_Server.gsl”“test_Client.gsl”を、
“SpiderMonkey”に移植してみた。

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


初めに、“test_Client.gsl”を移植して“Client.js”を作った:
// ------------------ Client.js
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 fname = '\\\\.\\pipe\\mypipe';
var hPipe = CreateFile( fname, 0xC0000000, 0, 0, 3, 0x80, 0 );
// 0xC~ : READ/WRITE、 0x80 : 通常はこれで
print( hPipe ); // 確認の為

var str = 'hogehoge';
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( hPipe, str, str.length, SZ.address(), 0 );
print( ret, SZ.value );

var str = readline(); // 手動での動作確認の為

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( hPipe, 'kamikamizzz', 11, SZ.address(), 0 );
print( ret, SZ.value );

var str = readline(); // 手動での動作確認の為


var fclose = libK.declare( 'CloseHandle', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t );
var ret =fclose( hPipe );
print( ret ); // 確認の為
これで、イイかな?

既存の“test_Server.gsl”を立ち上げた後、
“Client.js”を立ち上げて受信結果を確認。

OKだ。


次に、“test_Server.gsl”を移植して“Server.js”を作った:
// ------------------- Server.js
var libK = ctypes.open( 'kernel32' );

var CreatePIPE = libK.declare( 'CreateNamedPipeA', 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, ctypes.int32_t );
var fname = '\\\\.\\pipe\\mypipe';
var hPipe = CreatePIPE( fname, 3, 0, 3, 0, 0, 100, 0 );
print( hPipe ); // 確認の為

var ConnectPIPE = libK.declare( 'ConnectNamedPipe', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t, ctypes.int32_t );
var rcd = ConnectPIPE( hPipe, 0 );
print( rcd ); // 確認の為

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, // この char は上記対応!
ctypes.int32_t.ptr, ctypes.int32_t );

while ( true ){
var rcd =fread( hPipe, Buf, 256, SZ.address(), 0 );
if( rcd==0 ){ break; }
print( rcd ); // 確認の為
print( SZ.value ); // 確認の為
str = Buf.readString();
print( str ); // 目的の動作確認
}

var FlushFileBuffers = libK.declare( 'FlushFileBuffers', ctypes.winapi_abi,
ctypes.int32_t, ctypes.int32_t );
var rcd = FlushFileBuffers( hPipe );
print( rcd ); // 確認の為

var DisconnectNamedPipe = libK.declare( 'DisconnectNamedPipe', ctypes.winapi_abi,
ctypes.int32_t, ctypes.int32_t );
var rcd = DisconnectNamedPipe( hPipe );
print( rcd ); // 確認の為

var fclose = libK.declare( 'CloseHandle', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t );
var ret =fclose( hPipe );
print( ret );
で良さそう。

この“Server.js”を立ち上げておいて、
“test_Client.gsl”を立ち上げての動作確認。

OK。


駄目押しで、
“Server.js”と“Client.js”での通信。

完了。


本日はここまで。


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


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


170213

js-ctypes 学習:LuaPy 使用

2017-03-13 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-12)の記事「・・・文字列データの変換とファイル入出力」に続いて、
SpiderMonkey ( JavaScript/js-ctypes ) の学習継続。

先日(2017-03-11)の記事「SpiderMonkey/js-ctypes 学習」で、
自作の(機能的にはショボイものだが)test_dll.dllを使うことが出来た。

それでは、
かなりまともな(?)ものではどうか?

昨年7月(2016-07-04)の記事「LuaPy.dll 改訂」で書いた、
LuaPy_1.dll を使うことに挑戦。

出来たなら JavaScript から Python を利用できる。

やってみた。

つまりは、test_LuaPy_1.gsl の移植:
(“LuaPy_1.dll”は勿論の事“Sub_LuaPy_1.py”も当然必要)
// ===== test_LuaPy_1.js =====
var libL = ctypes.open( 'LuaPy_1' );

// int PyIni( char* ); // Pyファイル名
var PyIni = libL.declare( 'PyIni', ctypes.winapi_abi, ctypes.int32_t,
ctypes.char.ptr );

// int PyFun( char*, int, void* ); // 関数名、Stage、領域
var PyFun = libL.declare( 'PyFun', ctypes.winapi_abi, ctypes.int32_t,
ctypes.char.ptr, ctypes.int32_t, ctypes.int32_t.ptr );

// int PyFin( ); // Pyファイナライズ
var PyFin = libL.declare( 'PyFin', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t ); // 要ダミー???

// ----- 以上、宣言部 -----

// p = ffi.new( 'int32_t[2]' )
var p = ctypes.int32_t.array(2)(); // 配列データの宣言


print( PyIni( 'Sub_LuaPy_1' ) ); // Python 初期化

p[0]=5;
print( PyFun( 'fun', 0, p ) ); // 関数指定で呼出 ステージ
print( PyFun( 'fun', 1, p ) ); // 関数指定で呼出 ステージ

p[0]=20;
print( PyFun( 'fun2', 0, p ) ); // 関数指定で呼出 ステージ
print( PyFun( 'fun2', 1, p ) ); // 関数指定で呼出 ステージ

print( PyFin( 0 ) ); // Python ファイナライズ

libL.close();
var str = readline();
とした。

出来た!


ここで、学習したコト:

1.日本語コメントを含んでいる時、
   '.js' ファイルのコードが 'UTF-8' ではエラーとなる。
   いつでも、シフトJIS で行くべきダ。

2.関数呼び出し時、
   引数無しの方法が分からない?
   取り敢えず、ダミーで整数を指定した。


更に、決定版(?)
8月(2016-08-13)の記事「LuaPy 経由で使う汎用 Python サブ」で作った、
汎用の“Sub_LuaPy_Gen.py”を使う。

面倒なので、
当時の“test_Main_Sub_LuaPy_Gen.gsl”の移植じゃないもの:
// ===== test_LuaPy_Gen.js =====
var libL = ctypes.open( 'LuaPy_1' );

var PyIni = libL.declare( 'PyIni', ctypes.winapi_abi, ctypes.int32_t,
ctypes.char.ptr );

var PyFun = libL.declare( 'PyFun', ctypes.winapi_abi, ctypes.int32_t,
ctypes.char.ptr, ctypes.int32_t, ctypes.voidptr_t.ptr );
// ^^^^^^^^^^^^^^^^^^^^
var PyFin = libL.declare( 'PyFin', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t ); // 要ダミー

// ----- 以上、宣言部 -----

var IT = ctypes.voidptr_t.array(40)();

ret=PyIni( 'Sub_LuaPy_Gen' );

IT[0] = ctypes.char.array(5)('x=5;').address();
IT[1] = ctypes.char.array(11)('print x+2;').address();

ret = PyFun( 'Exec', 2, IT ); // ===== 関数指定で呼出
// x=5; print x+2; なので、 7 と表示される

ret=PyFin(0);
libL.close();
var str = readline();
となった。

本日学習したコト(続):

3.“PyFun”関数の第3引数:
   voidは JavaScript の予約語なので、voidptr_tで、
   ctypes.voidptr_t.ptrとなる。

4.配列先頭アドレス:
   hoge配列.address() で hoge配列の先頭アドレスとなる。


本日はここまで。


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


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


170212

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

SpiderMonkey/js-ctypes 学習

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


3年前(2014-05-19)の記事「Relo2 + MinGW で“.dll”作成」で書いた、
MinGW で作った自作DLL“test_dll.dll”

このDLLファイルにある“Add”関数を呼び出すコードは?
/***** use_test_dll.js *****/
// ----- 宣言
var lib = ctypes.open( 'test_dll' ); // .dll は無くても可
var ADD = lib.declare( 'Add', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t, ctypes.int32_t );
// ----- 利用
var ret = ADD( 5, 3 );
print( ret ); // 8 と出た。

lib.close(); // -- 後処理

var str = readline(); // -- [Enter]キー入力待ち
これで行けた。

文字列定義のコーテーションマークは、どっちでもOKですネ。


次に、配列についての学習。
/***** test_Array.js *****/
var VecType = ctypes.ArrayType(ctypes.int32_t); // 配列型を定義

var T = new VecType(5); // それを利用して、5要素の配列を作る

for( var i=0;i<5;i++ ){ T[i]=10*i+i+1; } // 適当に値を設定

print( T[1] ) // 中身を確認
var str = readline();
配列の添字はゼロオリジンですネ。
序でに、名前文字列は、大文字・小文字の区別がある。


最後に、
前回の最後に書いた、

  少しはまともな?コード:
  ファイルのサイズ取得

に関して、更に学習した結果:

1.「parseInt」関数を使わなくても良かった。
2.「getfsz」関数の第2引数で値を受け取る方法が分かった。

結果のコード:
/***** ファイルのサイズ取得(改訂版) *****/
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( 'zyx.txt', 0x80000000, 0, 0, 3, 0x80, 0 ); // 出力mode Open
print( fp ); // 確認。     16進数を定義できる。

/***** 第2引数の指定の仕方 *****/
// 値を受け取る引数の例:( 構造体方式 )
var V = new ctypes.StructType( 'tagV', [ { 'atai': ctypes.int32_t } ] );
var v = V();
var getfsz = libK.declare( 'GetFileSize', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t, V.ptr );
var ss = getfsz( fp, v.address() );
print( ss ); // ===== 下位 32bit 分
print( v.atai ); // ===== 上位 32bit 分

// 値を受け取る引数の例:( Documentに載っている方式 )
var v = ctypes.int32_t(1);
var getfsz = libK.declare( 'GetFileSize', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t, ctypes.int32_t.ptr );
var ss = getfsz( fp, v.address() );
print( ss ); // ===== 下位 32bit 分
print( v.value ); // ===== 上位 32bit 分

// 値を受け取る引数の例:( 配列を使う方式 )
var VecType = ctypes.ArrayType(ctypes.int32_t);
var v = new VecType(1);
var getfsz = libK.declare( 'GetFileSize', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t, ctypes.voidptr_t );
var ss = getfsz( fp, v.address() );
print( ss ); // ===== 下位 32bit 分
print( v[0] ); // ===== 上位 32bit 分

libK.close();
var str = readline();
以上2件(2番目は3つの方式)


本日はここまで。


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


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


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



おきてがみ

最新記事
カレンダー
02 | 2017/03 | 04
- - - 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
ブックマーク