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
関連記事
スポンサーサイト

コメントの投稿

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

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



おきてがみ

最新記事
カレンダー
09 | 2017/10 | 11
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
ブックマーク