Picture

Hi, I'm marksard.

Joy of making, Smile be making, Interest and making.

マグネットウィンドウ5.90リリース

ベクターから更新メールきたので

 マグネットウィンドウ5.90リリースしました。そのうちページも更新されると思います。リリースしようと思いつつほかの事にリソースを取られて(Fallout4やったり、ラズパイで遊んだり…)リリースしそびれてました。
 少し前に言ったとおり、このバージョンをもって既存ソースコードでの新規開発と重大不具合以外のメンテはストップします。(もともと止まってたようなもんだけど)

5.90のソースコードの話

 Readmeのほうでも少しだけ触れたのですが、マグネットウィンドウはWindows98時代にVisual Studio 6.0で作ってたソースコードが基盤となっています。作り始めた当時はMFCを勉強してなかったのもありWinMain()からWindowsAPIをガッツンガッツン叩きまくる、外部ライブラリを一切使ってない(stlも使わない)石器時代のソースコードです。
 なので設定ファイルを今風にJSONとかXMLをやろうと思っても、ベタC/C++のみでパースしようという気力は微塵も起きないし、リッチでカッコいいGUIなんてもってのほかで設定画面の部品を移動するだけでも実は結構手間だったり…とメンドクサさが先行して新規機能なんて…みたいな状態になっています。
 またマグネットウィンドウ機能をまとめてあるのクラス群の設計思想もちょっとイケてないところがあり、データ、コントローラ、インターフェースという階層構造になっていて複雑な事はしていないんだけどなんだか見通し良くないこともあり。

 ま、ともかくVC6→2003→2007→2013→2015→2017の変遷とともに、レガシーAPIの淘汰とセキュリティ向上対策の余波を食らったり、ソリューションとプロジェクトから1から作り直したり、(マルチモニタやアルファブレンド処理で)新しいAPIを使いたいけど後方互換のために静的リンクせずDllLoadしてAPI叩いたり、それをまたOSのサポート切れに合わせて静的リンクに切り替えたり、64bit/32bit両対応したり、高DPI対応したりと折に触れ手を入れてリファクタリングし延命してきたのですが、設計由来による細かいレベルの面倒くささとクライアントexe側のベタC/C++でのWindowsアプリのコーディング由来の面倒くささは排除出来ないので、そろそろ潮時だと思いました。

次のバージョンの話

 ほぼ新規で立ち上げなおすにあたって一通りの技術要件は確定してます。

  • .Netのクライアントと、C/C++のフックDLLの組み合わせで作成
    • →.Netはグローバルフック(WH_GETMESSAGE)をサポートしないので(参考
  • クライアントはWPFで作成
    • →Formより柔軟な配置が出来るので
  • 64bit/32bitアプリへのフックに対応するために両バージョンを同梱
  • 設定データ保存はjson形式
    • →文字列系の設定の書き出しが多少やりやすいなと思って
  • .Net⇔C/C++間、64bit/32bit間のデータのやり取りはメモリマップドファイル
    • →一番間便。メモリマップドファイルなら64/32bit関係なくシームレスに扱える
  • フックDLL間のデータのやり取りは共有メモリ
    • →グローバルフック内(64bit、32bit別)のグローバル変数で共有すべきものを使用

 こんなところです。
 ひとまずのゴールは5.90相当の機能を備えることですが、いくつかの機能は削除予定です。
 現状は常駐アプリ設定したクライアントとフックDLLの基礎部分は完成してて、5.90相当の設定項目の設定ファイルをjson形式で読み書きして、クライアント-フック間でメモリマップドファイルでその設定項目を共有使用する、といったアプリケーションの基盤部分は出来ています。
 特に.NetとC/C++の間のデータのやり取りに関しては以前に調査しててQiitaにまとめてあるもの(下記参照)をほぼそのまま使っています。C#7とか8だとリフレクションの記事のはもちょっと楽になるのかもしれませんが…。

 WPF使うので設定ダイアログを少し違った形で仕上げたいなと思っています。
 フックDLL側の中身は、とりあえず動くものにするのなら5.90のソースコードのデータクラスを改修して同じインターフェースを用意してあげれば動くと思うのだけど…コードそのものは再利用するとしても再設計はしたいかな。

Back to Top