技術的な注意事項

スレッドの制約について

  • 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)を使用しています。