トップページ⇒tech
1001コメント676KB

HTABOXコア Part2

レス数が1000を超えています。これ以上書き込みはできません。
0001hidebou2011/03/22(火) 04:27:36.93
HTABOXコアは新たな発想のHTML Application 開発、実行環境です。
現在各種コモンコントロールを提供する3.00のリリース準備中です。
お気軽にご意見をお寄せください。
ttp://kuroda.bglb.jp/htabox/
0951hidebou2012/10/02(火) 19:48:34.24
埋め込みビヘイビアを有効としたダイアログも安定動作するようです。
これでHTA、WebBrowser、HTMLDialogで何の前置きも無くHTABOXタグを
使用することができます。今日はそのダイアログが表示されるデモをお見せ
できるようにもうひとねばりしようと思います。いつのまにかこのスレッド
も終わりに近づいています。書けなくなったら、このサーバーが許せば新た
なスレッドを作りますので、目を通してやってください。
09529452012/10/02(火) 20:02:03.84
XP+IE6及びXP+IE8でツールバーアイコンの画像とWindow.ResizeToの正常な動作を確認しました
ただ>>945の時点で気付いておくべきだったのですが、Window.MoveToが無視されてしまうようです
0953hidebou2012/10/02(火) 21:06:56.50
>>952
了解しました。現状では確かに無視していますのでスクリプトからの移動も
可能にしたいと思います。今、母艦HTAからのダイアログ起動というコンテキ
スト地獄でもがいていますので、それにかたが付きしだい対策をしたいと思
います。
0954938_くさや2012/10/02(火) 22:31:20.45
コンテキストメニューとメニューバーについて提案です。
コンテキストメニューは階層構造が無い物の方が一般的ではないでしょうか?
また、メニューにマウスオーバーのイベントを付け加えて頂けないでしょうか。
(メニューの説明をステータスバーで表示するため)
そこまで重要でないので出来ればですが
宜しくお願い致します。
0955hidebou2012/10/03(水) 12:56:04.85
>>954
おっしゃるとおりです。双方のメニューについてご指摘の部分を改善します。
確かに機能を実装する作業は簡単ではありませんが、「こうだと便利」が実現
されていなければ、存在意義がありませんので、お気づきの点がありましたら
なんなりとご提案ください。
0956hidebou2012/10/03(水) 13:08:27.29
ダイアログの表示はおもったよりエレガントに解決できたのですが、インプロ
セスHTA起動時に、メッセージ間の衝突が散見されましたので、その解決に時間
を要してしまいました。本来使って欲しくないものを解析して使うという関係上
情報などあるわけもなく、さまざまな状況下で変化するメッセージの流れを読み
解くしかないものですから、完全は存在しないのですが、改善はできたようです。
いっそ、親ウインドウはWebBrowserベース一本にすればそれまでなんですが、
今までの流れもあってインプロセスHTAが制御できなければ「負け」みたいな
こだわりを持ってしまいます。
0957hidebou2012/10/03(水) 16:53:09.37
ttp://kuroda.bglb.jp/htabox/htabox300.zip
を更新しました。ウインドウ全体の移動については、内容HTMLが動いた後に
追従させるとギクシャクすることからすでに実装されているSetWindowPosで
対応していただくことにしました。表示、非表示、Zオーダー等も設定可能
です。詳しくはMSDNとソースを合わせてご覧ください。

アプリケーションメニューでWM_MENUSELECTが発生した場合、項目indexを
window.onMenuSelect(i)を通じてHTML側へ報告するものとしました。
アプリケーションメニューはHTML中の表示エレメントではないものですから、
HTML的イベント処理を強引に導入すると逆に複雑化するという判断です。

サンプルでは以下の単純な関数を定義して当該インデックスのタイトル文字列
をステータスバー先頭セクションに表示しています。
function window.onMenuSelect(i)
{
STATUS.SetText(0,APPMENU.cells[i].title);
}
0958hidebou2012/10/03(水) 17:04:34.33
コンテキストメニューについては、ルート要素にもonclickを定義できるよう
にしました。当然ですが動作を定義した要素は親にはなれません。また、この
メニュー定義時にもtitleを付けて説明のポップアップが出せるようでしたら
追加したいと考えています。

ダイアログについては、まだ、スタイル指定文字列を受け取らないなど、仕様
が確定していない状態ですが、全く本体と同じ拡張が可能である事をご覧いた
だけます。ダイアログは通常のHWND構造ですからMoveTo等はそのまま機能します。
0959hidebou2012/10/03(水) 17:28:40.90
ステータスバーにSBARS_SIZEGRIPがあると稀にヒットテストに失敗するよう
なので外しました。これは以前からHTML系にステータスを追加した場合に生
じていた事なのですが、要因については見当がつきませんから、僅かに外観
は劣ることになりますが、無くても機能としては変化しないので大きな課題
とは考えていません。これでHTABOXの骨格部分への変更が完了しました。
0960hidebou2012/10/03(水) 19:19:18.55
例によって非力なノートにIE8を入れてテストモジュールを動かしていますが
ダイアログ表示のキレが予想以上に鋭いので驚いています。このダイアログは
IE6以降が条件の比較的新しい手法によるものなのですが、デフォルトな生成
とは明らかにレスポンスが違います。HTMLダイアログの内部環境はHTAタグこ
そ無効ですが、まんまHTAですので、これをアプリケーションベースとした体
系でも支障は無いと感じさせます。
09619452012/10/03(水) 19:37:24.33
test.htm及びdialog.htmの機能は正常に動作しますが、
XP+IE6でまたタスクボタンが二重になるようです
0962hidebou2012/10/03(水) 21:36:45.86
>>961
了解しました。
0963hidebou2012/10/03(水) 22:35:27.78
ttp://kuroda.bglb.jp/htabox/htabox300.zip
を更新しました。タスクバーに楽屋裏のurlが表示されることを修正しました。
内部HTAでもサイト緒謔チ取り時には試瘧アギクシャクbキる瞬間があるbフですが、
それを隠しながら、軽量と安定を目指す部分がとても悩ましいのです。今回
は悩みに悩んだ末、基本的なことを外していたという展開でした。
0964hidebou2012/10/04(木) 15:01:12.86
今回のダイアログはIHostDialogHelperが生成するものなんですが、さて
デバッグ環境をと、実行中のプロセスにアタッチすると、表示中ダイアログ
のHTMLが見えないんです。なぜこのダイアログが高速にレスポンスするかの
答えはここにありそうです。ですから、HTABOXのスクリプトエンジンがそう
であるように、このダイアログで実行されるスクリプトは通常より高速であ
る可能性があります。

0965hidebou2012/10/04(木) 15:32:07.36
プログラミングというのは99%デバッグ環境を眺めている作業なわけで、ブレ
イクポイントを置いて変数の変化を追跡できるということは必須な条件だと
考えます。現状では内部スクリプトエンジンで隠蔽さえしなければHTABOX自体
でもそういったデバッグは可能なようです。(前述ダイアログを除いて)
0966hidebou2012/10/04(木) 15:43:10.81
もう一つの要素として、外部スクリプトとの連携とデバッグについて構想を
練っています。WebBrowserのデモでやった、傍らのjsをHTMLをホストするEXE
がインスタンス化し、相互にディスパッチで通信するという方式はCOM登録な
しに傍らのjsへ拡張されたHTML機能を認識させることが可能なだけでなく、
傍らにあるのはjsで無くてもホストがインスタンス化できるなら.NETだろう
が、Javaだろうが、ネイティブなDLLだろうが問題ないわけです。
0967hidebou2012/10/04(木) 16:04:08.73
HTMLと外部スクリプトの分割を強要するわけではありませんが、スクリプト
を含めて100k、200kというHTMLをアプリケーション冒頭にパースするのは得
策ではありません。おそらくユーザーはそのどんよりとした起動レスポンス
だけで萎えてしまうでしょう。理想はHTML中にはGUIに関連する引き金だけが
存在し、<HTABOX:Application id="WIN32"/>は傍らにあるjsやDLLのメソッド
を知っていて、HTML中から直接呼び出せる事です。これならばHTML中のスク
リプト実行速度の足枷もありませんし、本格的に隠蔽したければDLLにして
しまう選択肢もできます。
0968hidebou2012/10/04(木) 16:13:16.70
誰しもがVisual Studioを持っているという前提なら、このデバッグ手法につ
いては別の次元で論議すべきことなのだと思いますが、最低限office付属の
MSEが起動する状態で、快適なデバッグを十分に考慮したシステムの構造とは
何かについて、結論を出したいと考えています。
0969hidebou2012/10/04(木) 16:45:30.05
とりあえずJScriptかVBScriptならWSH系はあえて使わず、並列スレッド又は
並列プロセスで生成した非表示HTMLダイアログ(旧形式)のスクリプトエン
ジンでパースすべきというインスピレーションがあります。これならばエラ
ーを待たずともアタッチしてブレイクポイント待機できそうな気がしますし、
WSHが持つWScriptオブジェクトとの関連を断ち切ることで、#define的手法を
用いずともHTABOXとMSHTA又はリリースとデバッグを渡り歩ける気がします。
0970hidebou2012/10/04(木) 17:44:15.68
あぁIHostDialogHelperが生成するHTMLが見えないというのは勘違いでした。
これも自作ビヘイビアを認識させるためにごにょごにょしている部分がある
んですが、それが原因でHTMLをデバッガに見せないという性格に変化してい
るというが正しいようです。今まで、MSHTMLが生成するドキュメントのHTML
は隠せないと思っていたのですが、結果的にそれが実現されているのは驚き
です。
0971hidebou2012/10/04(木) 19:05:48.02
<HTABOX:Extern type="jscript" src="test.js" id="JS"/>
<HTABOX:Extern type="native" src="test.dll" id="COM"/>
のような属性を解釈するビヘイビアを新設し、HTMLからは当該IDへの呼び出し
を行うことができ、被参照側にディスパッチアドレスを保持可能な変数を置け
ば、HTML側からJS.Disp = document;で設定ができ、被参照側では必要に応じ
て、Disp.location等でHTML側情報を取得可能というのがシンプルで判りやす
い気がします。<HTABOX:ExternはHTMLがパースされる前に文字列としてホスト
が検出してsrc対象をインスタンス化、UIFLAGのようにHTML生成条件を設定可
能とすればよりエレガントですね。あぁ、私が漠然と思い描いていたHTMLアプ
リケーションの形ってこういうものだったかも知れません。データバインドや
CSSがらみのビヘイビアを除けば、完全なサイドバイサイドで動作させること
ができます。
0972hidebou2012/10/05(金) 00:32:27.77
右クリックによるコンテキストメニューの場合も選択状態が変化した場合
アプリケーションメニューと同じようにwindow.onPopupSelect(i);をコール
バックする仕様としましたが、改めて、WIN32APIメニュー系APIの作りの悪さ
と、説明の意味不明さに疲れ果ててアップする気力も失せました。
0973hidebou2012/10/05(金) 08:58:09.17
ttp://kuroda.bglb.jp/htabox/htabox300.zip
を更新しました。window.onPopupSelect(i);が存在すればコールバックされます。
これにより、コンテキストメニューの説明文をステータスバーに表示可能です。
内部HTAの生成過程にも若干の変更が加えられ、安定よりなセッティングとなっ
ています。
0974hidebou2012/10/05(金) 14:07:05.51
ttp://kuroda.bglb.jp/htabox/htabox300.zip
を更新しました。以前は通常生成のHTMLダイアログにもちょっかいを出していまし
たが、それを廃止し、拡張ダイアログの仕様を決定しました。
CreateDlgWindow(BSTR url, VARIANT arg, BSTR opt, bool mode);
引数は絶対パス、引数バリアント、ダイアログスタイル、モーダル真/モードレス偽
です。また、もうしこし柔軟な使い方ができるようにウインドウスタイルを
指定可能としたCreateDlgWindowExを新設しました。これによりダイアログ
をタスクに入れることが可能です。表示しつづけるヘルプウインドウ等に
利用できると思います。CreateDlgWindowにlong型の引数が追加され、この
引数が非ゼロであればダイアログ生成最終段階で適用されます。詳しくは
デモのtest.htmソースをご覧ください。
0975hidebou2012/10/05(金) 14:51:56.99
モーダルはwindow.returnValueを返さなければなりませんが、その辺の実装
がまだ甘かったようですので、見直します。COM的なリターンと、主スレッド
の開放タイミングが別というきめ細かな動きをしてくれるものですから、扱
いにくい面も出るようです。
0976hidebou2012/10/05(金) 16:10:36.14
ttp://kuroda.bglb.jp/htabox/htabox300.zip
を更新しました。拡張されたダイアログについてwindow.dialogArgumentsと
window.returnValueの部分を修正しました。なんか変な動きに見えたのは
リリースビルド状態でブレイクポイントを設定したからという落ちでした。
多くの場合、変数値は参照できなくても停止だけはしてくれるものなので
すが、今回は違ったようです。
0977デフォルトの名無しさん2012/10/05(金) 18:41:19.12
HTABOXAPP.exe本体に起因するバグではないですけど
onMenuSelectがシステムメニューにも反応してエラーになるのでtest.htm内でtry〜catchしておくと良いようです
0978hidebou2012/10/05(金) 18:47:21.05
>>977
了解しました。システムメニューからの情報が飛んでくることは考慮していま
せんでしたので、単に私の考えが浅いだけで対策が存在すると直感します。
貴重な情報をありがとうございました。
0979hidebou2012/10/05(金) 19:26:01.65
ttp://kuroda.bglb.jp/htabox/htabox300.zip
を更新しました。アプリケーションメニュー、コンテキストメニュー以外が
由来のWM_MENUSELECTを無視することにより977さんからご指摘のあったエラー
を回避しました。どうしても頭がその先にしか向かないのが私の欠点ですので
こういったご指摘は値千金です。ありがとうございました。
0980hidebou2012/10/05(金) 19:50:00.79
<HTA:Application 互換設定は必ず手がけますが、外部モジュール連携手法が
確立してからになります。私が認識している設定内容は下記のとおりです。

・applicationName
・border
・borderStyle
・caption
・commandLine
・contextMenu
・icon
・innerBorder
・maximizeButton
・minimizeButton
・navigable
・scroll
・scrollFlat
・selection
・showInTaskBar
・singleInstance
・sysMenu
・version
・windowState
0981hidebou2012/10/05(金) 20:08:30.79
そろそろこのスレッドともお別れです。一気に埋まった場合、私が目を通せな
い可能性が出ますので、新しいスレッド「HTABOXコア Part3」(予定)があった
らそちらにも書き込んでください。このスレッドにも1年半つぶやき続けました
のでなんか名残惜しい気がします。前スレも含めて長い間、遅々として進まな
い私の仕事を暖かく見守っていただいて、感謝の言葉も見つかりません。
0982hidebou2012/10/05(金) 22:07:29.42
ttp://kuroda.bglb.jp/htabox/htabox300.zip
を更新しました。メインウインドウ消滅時のアクティブウインドウ委譲につ
いて修正しました。一旦GUIスレッド系の配慮は必要ないかもしれないという
方向で検討していましたが、これを行わないと終了後にいずれのウインドウ
もアクティブにならない状態が生じるためゼロピクセルのウインドウを親と
してHTAウインドウが生成されます。
0983hidebou2012/10/05(金) 22:38:33.16
外部モジュール、手始めに隣接JS又はVBSをデバッグ時にパースするエンジン
はHTAの中身である{3050F5C8-98B5-11CF-BB82-00AA00BDCE0B}を要求ファイル
毎に生成した方が非表示ダイアログで処理するより軽いだろと思われます。
この場合もMS純正スクリプトデバッガやMSEでアタッチしブレイク待機可能
だと思います。.NET系については、各環境でのコンパイラを探すのが面倒です
からソースコード状態ならデバッグ時でもHTABOX内部のコンパイラ、もし各
言語でブレイクポイント待ちをしたい人はアセンブリをDLLコンパイルして
Visual Studio環境で待つ、ネイティブDLLな場合はVisual Studio環境等で待
つという感じにできるんじゃないかと思います。
0984hidebou2012/10/05(金) 22:54:09.94
ttp://kuroda.bglb.jp/htabox/htabox300.zip
を更新しました。本体ウインドウがタスクに表示されない事を修正しました。
0985hidebou2012/10/06(土) 12:59:35.62
いつもスクリプトを隠すことだけ考えていたものですから、本体HTMLのパース
を阻害しない状態でありながら、デバッガへ綺麗にスクリプトを見せるという
のは意外と細かなテクニックが必要になるようです。やはりスクリプトの場合
は非表示ダイアログが最も扱いやすい補助エンジンですが、jsにナビゲートし
てもパースはされないわけで、かといってdocument.write等で構築しても見え
るのはその構築動作コードだけになります。結局、独自プロトコルという手段
で解決できそうです。内容は単にスクリプトコード前後に<html><script...>
</script></html>を付加するだけですが、この場合はそういうHTMLファイルが
あったかのように表示されます。
0986hidebou2012/10/06(土) 19:22:45.44
ttp://kuroda.bglb.jp/htabox/htabox300.zip
を更新しました。外部JSをHTMLとは別にパースし、当該JSにdebugger;命令
を置いて、デバッガを起動するデモが加わりました。私の環境ではMSE7と
二つのバージョンのVisual Studioのいずれをデバッガとして起動するかの
ダイアログが表示され、JSのソースが表示されます。このデバッガ環境は
個々のインストール状況、開発環境状況によって千差万別ですが、インタ
ーネットオプションの「スクリプトのデバッグを使用しない」をオフにし
ないと自動的なデバッガの起動は抑制されてしまうと記憶しています。
0987hidebou2012/10/06(土) 19:37:58.11
最終的にスクリプトは自前の非表示HTA互換ウインドウで行っています。既製
品のHTMLダイアログは扱いが簡単でいいのですが、たとえ非表示でも必ずウイ
ンドウのアクティブを奪うことろが致命的な欠点ですので採用しませんでした。
また、コンテキスト的に遠いと管理しにくいことから、完全な別スレッドでは
なく、本体スレッドコンテキストではあるものの、ドキュメントはそのパース
には無関心である状態としています。ただ、フレームとか、ダイアログとかの
関連無しに、別HTMLインスタンスを生成することはコンテキスト的にタイトロ
ープです。例えば同じ結果を得る為にディスパッチ呼び出しをするのか生インタ
ーフェース呼び出しをするのかといった違いだけで動作とクラッシュが決まる
ような状態を体験しました。
0988hidebou2012/10/06(土) 20:00:56.76
C++とくにCOMプログラミングが難解とされる最大の要因はコンテキスト、
つまりその呼び出しはどのスレッドを起点にして行われているのか、その
スレッドは何をトリガーに起動したのか、Postでプリミティブな値だけを
渡して代替できるのか、等々の問題が直接目に見えないことにあります。
これに立ち向かう武器は、あらゆるところにブレイクポイントを置き、そ
こでインスタンスが生きているかを確認することに尽きますので、他人の
ライブラリやATLのようなマクロ依存することは大きなマイナス要因だと
感じます。少なくともこの本質的な問題を理解する前にそういった出来合
いのコードを使うのは、愚かしい行為です。
0989hidebou2012/10/06(土) 20:39:04.84
しかし、COMプログラミングは魅力的です。私がもし、ゼロからHTMLを解釈し
それをウインドウに描画し、イベントで連携するアプリケーションが書けるで
しょうか?答えは当然「No」です。数メガに及ぶバイナリを生成するたのソー
スは少なくとも数メガあります。これを僅か数百キロのソースでカスタマイズ
できるのはCOMだからこそです。
0990hidebou2012/10/06(土) 20:45:10.63
いつのまにか、モーダルダイアログがモードレス動作していることに気づき
ました。要因が判り次第、バイナリを更新する予定です。ご容赦ください。
0991hidebou2012/10/06(土) 20:57:48.62
ttp://kuroda.bglb.jp/htabox/htabox300.zip
を更新しました。添付test.jsは毎回デバッガが起動して面倒なのでdebugger;
をコメントアウトしました。デバッガ起動をテストしたい場合は有効にして
ください。モーダルも正常動作に戻りました。

var WSS = new ActiveXObject("WScript.Shell");
function test()
{
//debugger;
WSS.Popup("Hello");
}
0992hidebou2012/10/07(日) 10:35:00.08
参考までにMSHTAをフックした状態のデモを公開します。
ttp://kuroda.bglb.jp/htabox/htabox300b.zip
機能的には全く同じ状態となりますが、MSHTA.exeにはコモンコントロールの
バージョンを指定するマニフェストがありませんからツールバー、ステータス
が旧型で表示されます。逆に言えばマニフェストを置けばHTABOXと同じ表示に
なる訳です。
0993hidebou2012/10/07(日) 11:01:22.15
現在の流れから推察するに、このMSHTAフックモードはユーザーサイドでは
不要になると思われます。エディタから起動し、データバインドやGDI+系
COMDLLを絡めた検証は行ってませんが、その場合も通常のデバッガでアタッチ
可能なら、このモードは内輪だけのものになります。

内部生成HTAは本家よりやや柔軟なものですか、ついコンテキストを外した動
作となりがちなのですが、本家をフックした場合はその辺にシビアですから、
私の実験的なコードを正してくれる教師としては存在し続けると思います。
0994hidebou2012/10/07(日) 11:28:52.88
MSHTAをフックした状態のデモは単独EXEとして実行するとタスクにいやな残り
方をする場合があるので、公開を停止しました。Visual Studioでは正常なの
ですが、まだ勉強不足なようです。もしこれを使う必要が生じた場合は、その
点を確実に克服したいと考えています。
0995hidebou2012/10/08(月) 01:55:36.92
可能であれば<OBJECT/>もマニフェストやレジストリに無関係な状態にできな
いか半日もがきましたが、なかなか糸口がつかめません。COMサーバーでない
状態ならば、DLL無しでも自家発電マニフェストでHTABOXAPP.exe単体な状態
は作れたと記憶していますが、バイナリ開発時の事とは言え、MSHTAを利用す
るな状態でも何らかの偽装工作で<OBJECT/>が挿入できると素敵なのですが。
0996hidebou2012/10/08(月) 12:06:12.85
前述の技術を確立することができました。HTML上に無害でおとなしいCLSIDの
オブジェクト宣言を置き、生成過程をフックすることにより、任意なDLLへ摩
り替えるという手法です。現在の課題は各環境に必ず存在し、おとなしいとマ
ークされているActiveXはどれか?に移行しています。現時点での有力候補は
{1D2B4F40-1F10-11D1-9E88-00C04FDCAB92}、webvw.dllnなのですが、頻繁に使
用されるdllでは無いほうが好ましいので情報を収集しなければなりません。
0997hidebou2012/10/08(月) 12:24:10.18
ビヘイビアの有効利用、レジストリやマニフェストに依存しないオブジェク
トインスタンスの生成という「パーフェクト」な技術的基盤ができました。
今回の解析で興味深かったのは、総てのモジュールロードには偽装の余地が
あり、そこでロードされるjscritやvbscript用dllを軽くラップして渡すだけ
で、拡張可能なことです。もし、VBの速度とJSの柔軟性をいいとこ取りした
状態を作れれば素晴らしいですが、それは今後の課題にしたいと思います。
0998hidebou2012/10/08(月) 14:51:56.40
今のところダミーのCLSIDは{62112AA1-EBE4-11CF-A5FB-0020AFE7292D}
ShellFolderViewが最適ではないかと考えています。HTML冒頭にオブジェ
クト宣言がある場合、その直前にマップされるDLLは常に一定のようです。
したがって直前DLLのマップ要求を検出して次を入れ替え、以降は無関心に
なることで、実際にShellFolderViewが必要とされている場合との競合も
回避できるとの結果が出ました。この辺が環境やIEのバージョンに依存し
なければHTABOXの機能として採用したいと思います。
0999hidebou2012/10/08(月) 15:15:51.15
スレッドを作成しました。
http://toro.2ch.net/test/read.cgi/tech/1349676744/
このサーバーで1000番目に書き込むことは特別な意味があるようですので、
最後の書き込みはどなたかにお願いします。

ありがとうございました。そして今後ともよろしくお願いいたします。
1000デフォルトの名無しさん2012/10/08(月) 19:13:25.75
1000ならHTABOXコアが商業的に成功する
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。