Windows 11 22H2 で半角/全角キーを押すと Mery が落ちる問題について

はじめに

Windows 11 22H2 で半角/全角キーを押すと Delphi 製アプリがクラッシュするという問題が発生しているようです。

この問題は Windows 11 の特定のビルドまたは何らかのパッチによって発生するようで、Windows Update によって改善、再発する可能性があります。

また、同じビルドの Windows 11 でも問題が発生したり、しなかったりと現象の再現が非常に困難です。

Mery では Ver 3.3.8 でその対策を行ってみましたが、現在、クリーンインストールした検証環境の Windows 11 Pro 22H2 22621.521 では問題が再現されなくなってしまいました。

対策の有効性および副作用などについても不明な点があるので、Delphi をお使いかつ問題が発生する環境をお持ちのかたがいらっしゃったら検証にご協力いただけたらと思い、この記事で情報共有させていただきます。

また、以前のバージョンの Mery をお使いで問題が発生しているかたも Ver 3.3.8 以降にアップデートして問題が改善されるかどうか検証にご協力いただけると助かります。

それから、Delphi の開発元の Embarcadero でも新しい IME で発生する不具合については以前から認識されているようですが、

エンバカデロでは、今後も IME に影響する動作に関しては、VCL 側で特定のバージョンに合わせて独自の対処コードを埋め込む方針ではなく、基本的に Windows OS および IME の修正によって対処すべきと判断しております。

出典: Windows 10 (20H2) 以降の環境で、VCL フォームアプリケーションを実行した時の IME の挙動

との見解のようなので、Quality Portal には投げませんでした。

現象

  • Windows 11 22H2 で新しい IME を使用して Delphi 製アプリを起動し、半角/全角キーを押すとアプリがフリーズした後、落ちる
  • ImmSetOpenStatus で IME を開いた場合は落ちない?
  • FMX アプリでは問題が発生せず、VCL アプリのみが対象となっている

以下、問題が発生するという情報があったアプリで、いずれも Delphi の VCL で開発されたものと思われます。

  • Mery Ver 3.3.8 未満 (Ver 3.3.8、Ver 3.3.9 で改善されているとのご連絡を 3 件、いただきました。検証のご協力ありがとうございます!)
  • TeraPad
  • NanaTerry
  • Jane Style
  • PDIC
  • TMPGEnc Video Mastering Works 5

同じ Delphi 製 (VCL) でも、次のアプリでは発生しませんでした。

  • PyScripter

確認

  • Windows 11 Pro 22H2 22621.105 で現象が再現
  • TextInputFramework.dll の内部で例外が発生
  • Delphi XE2 または Delphi 10.4.2 で VCL を使って TForm に TEdit を貼り付けただけのプログラムでも発生
  • Delphi 10.4.2 の FMX アプリだと発生しない (Delphi XE2 は FMX でも発生)
  • uses に Vcl.Edge を含めると発生しない (SHDocVw でも良い?)

Mery Ver 3.3.8 での対策

どのユニットでも構わないので一番下に以下のように記述し、浮動小数点例外マスクフラグを設定する。

Delphi XE2 の場合
initialization
  SetExceptionMask(exAllArithmeticExceptions);
新しめの Delphi の場合
initialization
  FSetExceptMask(femALLEXCEPT);

考察

上記のコードは Vcl.Edge.pas の一番下に書かれているため、uses に Vcl.Edge を含めることで改善されていたようです。似たような記述は SHDocVw の一番下にもあるので、SHDocVw を使っている PyScripter だと問題が発生しないのかもしれません。

また、FMX の場合は何もしなくても femALLEXCEPT がセットされているようです。

次のリンクは浮動小数点例外マスクの設定および解除について記載されている Microsoft の記事ですが、「既定では、ランタイム ライブラリは、すべての浮動小数点例外をマスクします。」との記載があるので、Visual C++ で開発したアプリだと問題が発生しない (例外が発生していても気づかない?) のかもしれません。(詳しいことはわかりません)

上記の対策が良いのか悪いのか、Windows 11 のどのビルドに対しても有効なのか、アプリケーションによっては浮動小数点例外が必要なこともあるかも?など、不明な点も多いです。

この対策で問題が改善された、改善されなかった、別の問題が発生する、別の対策がある、などお気づきの点がありましたらツイッターまたはフォーラムまで情報をいただけるととても助かります。

ユーザー側での対策

アプリ側での対策が困難な場合など、ユーザー側で出来る対策として以前のバージョンの Microsoft IME を使うと改善されるという情報をいただきました。 (KB4564002)

現状

Windows 11 の設定で [オプションの診断データを送信する] のオン/オフが関係している可能性があります。

私の環境ですと [オプションの診断データを送信する] がオフになっていましたが、この設定をオンにすると Delphi 製アプリがクラッシュする問題が再現しました。

スポンサーリンク