Windows 10 (バージョン 1909) 環境で特定のWindows Updateを適用すると、 TScrollコンポーネントが白く表示される症状が発生する
対象となるWindowsのバージョン
- Windows 10 (バージョン 1909)
目次
問題
以下の条件を全て満たした場合、VCL のTScrollBarコンポーネントが白く表示され、正常に動作しない症状が報告されています。
- Windows 10 (バージョン 1909)を利用
- Windows Update(KB5000850 または KB5001337)を適用
- [プロジェクト] > [オプション] > [アプリケーション] > [マニフェスト] > [マニフェストファイル]の”ランタイムテーマの有効化”=false
正常に表示されるケースの例:
正常に表示されないケースの例:
この症状は、利用しているRAD Studio/Delphi/C++Builderのバージョンには関係なく、上記の条件を満たし、VCLのTScrollBarコンポーネントを利用していると発生します。
特に古いバージョン(例えば、Delphi 7以前やC++Builder 6以前 等)で構築したアプリケーションでは、ランタイムテーマの設定に未対応、かつWin32のみの対応となりますので、上記の条件を満たすWindows環境で本症状が再現いたします。
原因
[プロジェクト] > [オプション] > [アプリケーション] > [マニフェスト] > [マニフェストファイル]の”ランタイムテーマの有効化”の設定は、アプリケーションがロードするコモンコントロール(COMCTL32.dll)のバージョンが影響します。
”ランタイムテーマの有効化”=Trueでは、Windowsマニフェストファイルに以下の定義が追加されます。
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
publicKeyToken="6595b64144ccf1df"
language="*"
processorArchitecture="*"/>
</dependentAssembly>
ランタイムテーマの有効化”=True(デフォルト)では、バージョン6のCOMCTL32.dllがロードされます。
逆にランタイムテーマの有効化”=Falseでは、上記の定義がWindowsマニフェストファイルから削除され、バージョン5のCOMCTL32.dllがロードされます。
本症状は、全く同じVCLのソースコードでも、バージョン5のCOMCTL32.dl lをロードしているアプリケーション全般に影響します。これはRAD Studio/Delphi/C++Builder以外にも、Visual Studioなど別の開発ツールで構築したアプリケーションでも同じ条件をみたす場合は、同様の問題が発生します。
こちらで検証した限りでは、Visual StudioでWinFormsの.netプロジェクトを作成し、HScroll、あるいはVScrollコンポーネントを配置し、メインルーチンでEnableVisualStylesメソッドを無効にし、プラットホーム=AnyCPUでビルドすると同じ問題が再現することを確認しています。
またvbforums.com、answers.microsoft.comのスレッドでも、VB6で構築したアプリケーションで同様の問題が報告されていました。
また同様の症状が発生する他社製品の報告例もございます。
今後も同様な事例報告が増えていくことが予想されます。
現時点では、マイクロソフト社から正式な報告が無いため、不確定な情報を含みますが、同じ条件で他のアプリケーションにも影響していることから、エンバカデロでは本症状はWindowsの不具合と考えます。
(4/26 追記)
マイクロソフト社から正式に本現象の不具合に関するアナウンスがありました。
2021 年 4 月 13 日 — KB5001337 (OS ビルド 18363.1500)
以下はその抜粋です
この更新プログラムをインストールした後、スクロール バー コントロールが画面に空白で表示され、機能しない場合があります。 この問題は、64 ビット Windows 10 (WOW64) で実行されている 32 ビット アプリケーションに影響します。このアプリケーションは、USER32.DLL SCROLLBARウィンドウ クラスのスーパークラスを使用してスクロール バーを作成します。 この問題は、Visual Basic 6 アプリケーションで使用される HScrollBar コントロールと VScrollBar コントロール、および.NET Windows Forms アプリケーションで使用される System.Windows.Forms.ScrollBar から派生したクラスにも影響します。 スクロール バー コントロールを作成すると、64 ビット アプリケーションで最大 4 GB のメモリ使用量の増加が発生する可能性があります。
SCROLLBAR ウィンドウ クラスを使用して作成 したスクロール バー、またはウィンドウ スタイルのWS_HSCROLLをWS_VSCROLL関数を使用します。 バージョン 6 で実装されているスクロール バー コントロールを COMCTL32.DLLアプリケーションは 影響を受け取る必要があります。 これには 、Application.EnableVisualStyles()を呼び出す .NET Windows Forms アプリケーションが含まれます。
Microsoft は解決に取り組み、今後のリリースで更新プログラムを提供します。
エンバカデロの見解
本症状が再現するWindows 10のバージョンは、現時点では1909のバージョン以外は報告はありません。
これは、バージョン1909のWindowsアップデート(KB5001337)を適用すると、
C:\Windows\WinSxS¥x86_microsoft-windows-shell-comctl32-v5.....
フォルダ内のCOMCTL32.dllが新しいタイムスタンプで作成されているため、バージョン5のCOMCTL32.dllがこのKBによって置き換わっているものと推察します。
そしてWindows 10の別バージョン(例えば、バージョン 2004、あるいは20H2)で同時期にリリースされたWindowsアップデートを適用しても、COMCTL32.dllは置き換わっていないため、同じ問題は発生しません。
よって現状ではWindows 1909に限定した不具合ではないかと考えております。
以上により、もしWindows 10の不具合の場合には、VCL側で対処することは難しく、Windows側の修正を待つことが望ましいという見解です。
解決
アプリケーションがバージョン5のCOMCTL32.dllをロードすると発生するため、[プロジェクト] > [オプション] > [アプリケーション] > [マニフェスト] > [マニフェストファイル]の”ランタイムテーマの有効化”=Trueに変更してください。
なお、Windows 10(1909)よりも後のバージョンでは、本症状は発生しません。
そのため、もしランタイムテーマの有効化=trueに変更してすぐに対処することが難しい場合、Windows 10の最新バージョンへアップデートすることを検討してください。
ターゲットプラットホーム=Win32でビルドしたアプリケーションの暫定的な対処方法をまとめますと、
- [プロジェクト] > [オプション] > [アプリケーション] > [マニフェスト] > [マニフェストファイル]の”ランタイムテーマの有効化”=Trueに設定
または
- Windows 10の最新バージョン(例えば、バージョン20H2)へアップデート
となります。
Windows 10 (1909)のサポート期限は2021年5月11日迄となっているので、後者を推奨いたします。
(5/12 追記)
2021年5月11日にリリースされたWindowsアップデート(KB5003169)によって本症状は修正されました。