技術的な注意事項
スレッドの制約について
- SeraphyScriptDialogはUI用コンポーネントでの標準であるSTA(シングルスレッドアパートメント)で動作するCOMオブジェクトとして作成されています。
- マルチスレッドからの呼び出しには使用できません。
- また、WindowsのWin32の原則として、ウィンドウを作成したスレッドがメッセージポンプでメッセージを処理する必要があるため、
スクリプト上でウィンドウを作成した場合、そのウィンドウは、スクリプト内(もしくは、スクリプトと同じスレッド内)で処理しなければならないことに注意してください。
モードレス表示、メッセージループについて
- SeraphyScriptDialogのDoEventsメソッド、およびWaitEventメソッドはそのスレッドのメッセージキューをWindowsの標準的な方法で処理します。
- このときアプリケーションの同一スレッド上に他のUI要素がある場合には、そのUIのメッセージもWindowsの標準的な方法でまとめて処理されます。
- このとき、もしアプリケーションがメッセージ処理に独自処理を行っていた場合には、それらの処理が行われず、予期せぬ結果になる可能性があります。
- また、このような場合には、スクリプトを動作させながら、ほかのUI要素も反応できるため、擬似的にマルチスレッド的に見えるかもしれませんが、おそらく、アプリケーションに再入可能になっていない部分がある場合には、アプリケーションが想定していない動作となる可能性があります。
- これはアプリケーションの問題ではなく(また、SeraphyScriptDialogの問題でもなく)メカニズム的に、そのようなものだとご理解ください。
- なお、DoEvents, WaitEventを使わない、モードレスダイアログの場合、親ウィンドウはディセーブル状態となり操作不可能となるため、問題となる可能性は低いと考えられます。
- WSHから使う場合には、WSHはシングルスレッドで動作しており、かつ、他のウィンドウはありませんので、この問題は生じません。
モーダル表示について
- 旧バージョンVersion1.0のモーダル表示は、MFCのCDialog::DoModalメソッドを単純に呼び出していました。
- Version2.0では、実質的にモーダルもモードレスと同じようにメッセージを処理しています。
- モーダルがモードレスと違なる点は、
- イベントが発生するまでスクリプト側に制御を戻さない
- 現在アクティブなウィンドウをディセーブルにしてからフォームを構築する
となります。
リソースについて
- Version1.0, 2.0ともに日本語リソースのみ使用していました。
- Version2.1では、ニュートラル言語と日本語の両方を定義しています。
- 日本語ではフォントはMS UIゴシックを使用しています。
- ニュートラルではフォントはシステムデフォルト(MS Shell Dlg)を使用しています。