-
Notifications
You must be signed in to change notification settings - Fork 7
Description
種々の事情により、サーバー・クライアント構成に移行します。
理由・目的
- C++ と Win32API で GUI を実装するのは大変であるため。
- HSP ユーザーの手で改変することを容易にするため。
- クライアントは Win32API を使い倒した複雑な実装になるとは思いますが、いちおうは HSP3 で書かれています。そのため、ユーザー自身が必要に応じて手を加えることも可能になるはずです。
- 少なくとも C++ をイチから覚えたり Visual Studio をインストールしたりしなくてもいいです。
- ドッグフーディング をするため。
- ドッグフーディングとは、開発者自身がそのアプリを使い、ユーザーとしての視点を持つことです。
- Visual Studio Code (VSCode) 上でのデバッグを可能にするため。
- VSCode は Debug Adapter Protocol (DAP) という仕組みにより、任意の言語のデバッグが可能です。クライアントとして DAP に対応したものを用意すれば、VSCode のデバッガーを利用できるはずです。(hsp3-ginger を参照)
- また、それは GUI ベースの通常のデバッガーと同時にインストール可能にしたいです。そのために、hsp3debug.dll 自体にはウィンドウの表示などの機能を持たせず、サーバーとして動作させる方が都合がいいです。
仕組み
デバッガーの一部をHSPで実装する ことにします。以下のような仕組みです:
まず HSP のプログラムのデバッグ実行の開始時に、hsp3debug.dll (デバッガー) がロードされます。このとき、クライアント (HSP で作った exe) を起動します。以下、hsp3debug.dll のことをサーバーと呼びます。
サーバーとクライアントは、プロセス間通信という仕組みにより、互いにデータの送受信ができるようにします。
これにより、サーバーがデバッガーとして知っている情報をクライアントに渡すことができます。例えば logmes 命令が実行されたとき、HSP ランタイムからサーバーに通知が飛びます。サーバーからクライアントに「logmes が実行されて、その内容はこれ」と通知を出すことで、クライアントは logmes のデータを受け取れます。あとは、単にそれを mesbox か何かに表示すればよいです。
逆に、クライアントの「停止」ボタンを押されたときは、サーバーに「実行を停止する」旨のメッセージを送り、サーバーが HSP ランタイムに実行停止を伝える、という手順で実行の停止やステップ実行などが可能です。
通信の詳細
プロセス間通信は具体的にはウィンドウメッセージを使います。サーバーとクライアントはどちらも自分のウィンドウを持っていて、そのハンドル (hwnd) を教えあいます。サーバーがクライアントを起動するとき、コマンドライン (dir_cmdline) としてハンドルを渡します。
クライアントはコマンドラインに書かれたサーバーのウィンドウのハンドルを読み取り、そこに向けて「クライアントが起動した」旨のメッセージを送ります (sendmsg)。このメッセージにクライアントのウィンドウハンドルを添付しておくことで、サーバーがクライアントにメッセージを送り返せるようになります。
ウィンドウメッセージでは70ビット(整数3つ分)程度のデータしか送れませんが、それ以外のデータはメモリマップトファイルという機能により受け渡します。メモリマップトファイルは、プログラムの終了時に消える点と、非常に高速であるという点を除いて、ファイルと同様です。
サーバーがサーバー用・クライアント用にメモリマップトファイルを2つ作ります。サーバーやクライアントは相手にメッセージを送る前に、自分のメモリマップトファイルに送りたいデータを書いておきます。メッセージを受信したとき、相手のメモリマップトファイルに書かれているデータを読むことで、メッセージにデータが載っているかのように扱います。
(追記 2019-12-07: 標準入出力を行う方法に転換しました。)
その他
- クライアントは HSP に限らず、Windows 上で動作するどんなプログラムでもかまいません。
- 特に Electron のようにブラウザエンジンを使って Web 技術 (HTML/CSS/JavaScript) でフロントエンドを書くことも可能です。(hsp3-ginger の中の hsp3-debug-spider にサンプルがあります。)
- おそらくこちらの方が開発の負担が低く、クオリティの高いデバッガーを作れると思うので、誰かやってみてください。
- knowbug では上記の「HSP ユーザーの手による改変」を重視するために採用しませんでした。
- 特に Electron のようにブラウザエンジンを使って Web 技術 (HTML/CSS/JavaScript) でフロントエンドを書くことも可能です。(hsp3-ginger の中の hsp3-debug-spider にサンプルがあります。)