Windows の window class extra bytes 互換性メモとは?影響範囲と管理者の確認ポイント

Windows の「A compatibility note on the abuse of Windows window class extra bytes」は、一般利用者向けの新機能ではなく、Win32 API を使うデスクトップアプリ開発者・保守担当者向けの互換性メモです。結論から言うと、通常の Windows 管理者がすぐに設定を変更する必要はありません。ただし、古い Win32 アプリ、独自 UI フレームワーク、16bit 時代から継承されたコード、C/C++ 製の業務アプリを保守している場合は、ウィンドウクラスの extra bytes を本来の用途以外に使っていないかを確認する価値があります。

2026年6月30日に Microsoft Dev Blogs の The Old New Thing で公開された記事では、Windows の互換性維持のために、16bit プログラムだけが GWW_CBCLSEXTRA を変更できる一方、32bit / 64bit プログラムではその抜け道が塞がれていることが説明されています。これは「Windows に新しい管理設定が追加された」という話ではなく、過去のアプリが仕様外の場所にデータを隠していた事例から、現在のアプリ保守で避けるべき実装を学ぶための更新ポイントです。(Microsoft for Developers)

目次

Windows の「window class extra bytes」とは何か

Windows の Win32 API では、ウィンドウを作成する前に「ウィンドウクラス」を登録します。ウィンドウクラスには、ウィンドウプロシージャ、アイコン、カーソル、背景ブラシ、クラス名などの情報が含まれます。

このウィンドウクラスには、アプリケーションが追加で利用できる領域として class extra byteswindow extra bytes があります。

種類何に紐づくか主な用途注意点
class extra bytesウィンドウクラス同じクラスに属するウィンドウで共有したい小さなデータクラス登録時に確保する必要がある
window extra bytes個々のウィンドウインスタンスウィンドウごとに異なる状態やポインター個別ウィンドウの状態管理に向く
GCL_CBCLSEXTRAclass extra bytes のサイズ情報class extra bytes のバイト数を取得・設定するための定数サイズ値を書き換えても、すでに確保済みのメモリサイズは変わらない

WNDCLASSEX 構造体には cbClsExtracbWndExtra があり、cbClsExtra はウィンドウクラス構造体の後ろに追加で割り当てるバイト数を指定します。Microsoft Learn でも、cbClsExtra は「ウィンドウクラス構造体の後に割り当てる追加バイト数」であり、システムによってゼロ初期化されると説明されています。(Microsoft Learn)

つまり、追加メモリを使いたい場合は、後から適当に場所を探すのではなく、RegisterClassEx でクラスを登録する時点で必要なサイズを指定するのが基本です。

WNDCLASSEX wc = {};
wc.cbSize = sizeof(WNDCLASSEX);
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = sizeof(LONG_PTR);  // クラス用の追加領域を明示的に確保
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.lpszClassName = L"MyWindowClass";

RegisterClassEx(&wc);

2026年6月30日の更新ポイント

今回の公式ブログの主旨は、Windows の互換性維持に関する歴史的な注意喚起です。ポイントは次の3つです。

確認項目更新ポイント実務上の見方
対象Win32 API のウィンドウクラス extra bytes一般ユーザーではなく、ネイティブ Windows アプリの開発・保守担当者向け
変更内容16bit アプリ互換のため、GWW_CBCLSEXTRA の変更を許すケースがある現行の 32bit / 64bit アプリで同じ実装を期待してはいけない
管理対応Windows の管理ポリシーや設定変更は示されていないコードレビュー、互換性テスト、古いライブラリ調査が中心

The Old New Thing の記事では、過去にあるプログラムが GWW_CBCLSEXTRA を「private data を保存する場所」として使っていたことが紹介されています。しかし、GWW_CBCLSEXTRA は本来、class extra bytes のサイズを表す値です。データ保存領域ではありません。(Microsoft for Developers)

さらに重要なのは、GWW_CBCLSEXTRAGCL_CBCLSEXTRA を変更しても、すでに確保されたメモリサイズは変わらないという点です。Microsoft Learn の SetClassLongPtr の説明でも、GCL_CBCLSEXTRA を設定しても、すでに割り当てられている extra bytes の数は変わらないとされています。(Microsoft Learn)

影響範囲:一般ユーザーよりも古い Win32 アプリの保守担当者が対象

この情報の影響範囲は限定的です。Windows Update のように、全ユーザーの操作や設定が変わる話ではありません。

影響を受ける可能性があるのは、主に次のような環境です。

対象影響の可能性確認すべき内容
一般的な Windows 11 / Windows 10 利用者低い追加対応は基本的に不要
社内業務アプリの利用部門低〜中古いアプリで UI 不具合が出ていないか確認
C / C++ 製の Win32 アプリ開発チームGetClassLongPtrSetClassLongPtrcbClsExtra の使い方を確認
旧式の独自 UI フレームワークを保守するチーム中〜高仕様外のデータ保存やポインター格納がないか確認
16bit アプリ互換やレガシー移行を扱う組織高い16bit 時代の前提を 32bit / 64bit に持ち込んでいないか確認

特に注意したいのは、「現在は 64bit Windows で動いているが、元のコード設計が古い」というケースです。過去のコードでは、整数値を保存する場所にポインターを入れる、サイズ情報を一時保存領域として流用する、ドキュメント外の領域を使う、といった実装が存在することがあります。

今回の記事は、そうした実装が Windows の互換性によってたまたま動いてきた可能性を示しています。

設定変更は必要か

今回の更新ポイントに関して、Windows 管理者がグループポリシー、Intune、レジストリ、Microsoft Configuration Manager などで変更すべき設定は示されていません。

対応の中心は、OS 設定ではなくアプリケーション側の確認です。

項目対応要否理由
Windows の設定変更不要管理設定の追加や変更は示されていない
セキュリティベースライン変更原則不要セキュリティ機能の有効化・無効化の話ではない
Intune ポリシー変更原則不要デバイス構成ポリシーで制御する内容ではない
アプリの互換性テスト必要に応じて実施古い Win32 アプリや独自 UI 部品がある場合は確認する
ソースコードレビュー開発・保守チームでは推奨仕様外の extra bytes 利用を早期に見つけるため

管理者が行うべきことは、「Windows の設定を変えること」ではなく、「社内で使っている古いデスクトップアプリに該当リスクがないかを開発担当者と確認すること」です。

移行期限はあるか

今回の公式情報では、特定の移行期限や廃止日、強制変更日は示されていません。

そのため、すぐにアプリ改修を完了しなければならないという種類の告知ではありません。ただし、移行期限がないからといって放置してよいわけではありません。仕様外の実装は、OS バージョン、ビルド、CPU アーキテクチャ、セキュリティ強化、将来の互換性変更によって表面化する可能性があります。

実務では、次の優先順位で確認すると効率的です。

優先度対象理由
現在も更新している C / C++ 製の業務アプリソース修正やテストが可能なため、早めに健全化しやすい
32bit から 64bit へ移行中のアプリポインターサイズの違いによる不具合が出やすい
独自コントロール、古い MFC / Win32 ラッパーextra bytes を内部的に使っている可能性がある
ベンダー製の古いクライアントアプリ自社で修正できないため、ベンダー確認が必要
Web アプリ、UWP、一般的な Microsoft Store アプリ今回の話題と直接関係しにくい

管理者が確認すべきポイント

Windows 管理者や情報システム部門は、ソースコードを直接読む立場でなくても、次の観点で棚卸しできます。

古い業務アプリが残っていないか確認する

まず、社内で使っている Windows デスクトップアプリのうち、次の条件に当てはまるものを洗い出します。

  • 10年以上前から使っている
  • 32bit アプリとして動作している
  • C / C++、MFC、Win32 API ベースで作られている
  • 独自の画面部品やカスタムコントロールを多用している
  • OS 更新後に画面描画、入力、ダイアログ表示の不具合が出たことがある
  • 開発元が不明、または保守終了している

この段階では、すべてのアプリを改修する必要はありません。まずは「影響調査の対象」を絞ることが重要です。

開発チームに確認すべき API 名

開発チームやベンダーに確認する場合は、抽象的に「Windows の互換性は大丈夫ですか」と聞くより、具体的な API 名を挙げた方が話が早く進みます。

確認対象になりやすい API・構造体は次の通りです。

種別確認対象見るべきポイント
構造体WNDCLASSEX / WNDCLASScbClsExtracbWndExtra を意図的に設定しているか
クラス登録RegisterClassEx / RegisterClassextra bytes のサイズを登録時に正しく確保しているか
クラス情報取得GetClassLongPtr / GetClassLongGCL_CBCLSEXTRA を値保存目的で使っていないか
クラス情報設定SetClassLongPtr / SetClassLongGCL_CBCLSEXTRA を変更してメモリ領域が増えたと誤解していないか
ウィンドウ情報GetWindowLongPtr / SetWindowLongPtrウィンドウごとの状態保存とクラス共有データを混同していないか

Microsoft Learn では、GetClassLongPtr は指定したクラスの extra class memory または WNDCLASSEX 構造体の値を取得する API と説明されており、GCL_CBCLSEXTRA は class extra memory のサイズを取得する値として定義されています。(Microsoft Learn)

32bit / 64bit 移行時のポインター切り詰めを確認する

古い Windows アプリでは、ポインターを LONGint に入れていたコードが残っていることがあります。32bit では偶然動いても、64bit ではポインターが切り詰められて不具合になる典型的なパターンです。

Microsoft の関連する解説では、32bit と 64bit の両方を対象にするコードでは、ポインターサイズに対応した GetWindowLongPtrGetClassLongPtr 系の API を使う設計意図が説明されています。(Microsoft for Developers)

避けたいコードの考え方は、次のようなものです。

// 悪い例:ポインターを 32bit 前提の型に押し込む
LONG value = (LONG)pMyData;
SetClassLong(hwnd, 0, value);

64bit 対応を考える場合は、ポインターサイズを意識した型と API を使います。

// よい例:ポインターサイズに対応した型と API を使う
SetClassLongPtr(hwnd, 0, reinterpret_cast<LONG_PTR>(pMyData));

auto pData = reinterpret_cast<MyData*>(
    GetClassLongPtr(hwnd, 0)
);

ただし、ここで重要なのは「extra bytes を使えばよい」という話ではありません。使う場合は、cbClsExtra で必要な領域を登録時に確保し、用途を明確にする必要があります。

開発者が避けるべき実装パターン

今回の更新ポイントから学べる実務上の教訓は、ドキュメント上の意味と違う目的でフィールドを使わないということです。

特に避けたいのは、次のような実装です。

避けるべき実装なぜ危険か代替策
GCL_CBCLSEXTRA に独自データを保存するサイズ情報であり、データ保存領域ではないcbClsExtra で確保した領域を使う
SetClassLongPtrGCL_CBCLSEXTRA を変更して領域拡張したつもりになるすでに割り当て済みの extra bytes 数は変わらないクラス登録時に必要サイズを決める
32bit 前提でポインターを LONG に格納する64bit で値が切り詰められる可能性があるLONG_PTRUINT_PTRSetClassLongPtr を使う
クラス共有データとウィンドウ個別データを混同する複数ウィンドウ間で状態が干渉する共有は class extra、個別は window extra または GWLP_USERDATA
古いサンプルコードをそのまま流用する現在の 64bit 前提と合わない場合があるMicrosoft Learn の現行 API 説明に合わせる

「Finding an illicit place to hide data」から読み取るべきこと

今回の要点にある “Finding an illicit place to hide data.” は、直訳すれば「データを隠すための不正な場所を見つける」という意味です。

ここでいう「不正」は、マルウェアの隠蔽というより、本来データ保存用ではないフィールドを、アプリが勝手にデータ置き場として使っていたという文脈です。

Windows は非常に長い互換性の歴史を持つため、過去のアプリが仕様外の使い方をしていても、動作を壊さないために例外的な挙動を残していることがあります。The Old New Thing の記事では、16bit プログラムについては互換性のため GWW_CBCLSEXTRA の変更を許す一方、32bit / 64bit プログラムではブロックしていると説明されています。(Microsoft for Developers)

管理者や開発者にとって重要なのは、「Windows が互換性を維持してくれるから大丈夫」と考えることではありません。むしろ、互換性によってたまたま動いているコードを見つけ、将来の移行や 64bit 化で問題化する前に修正することです。

実務での確認手順

社内アプリや自社製品を確認する場合は、次の順序で進めると無駄が少なくなります。

手順作業内容判断基準
1対象アプリを棚卸しするWin32 / C++ / MFC / 独自 UI のアプリを優先
232bit / 64bit の実行形態を確認する64bit 移行予定のある 32bit アプリは優先度高
3該当 API を検索するSetClassLongSetClassLongPtrGCL_CBCLSEXTRA など
4extra bytes の用途を確認するサイズ情報をデータ保存に流用していないか
5テスト環境で動作確認する最新 Windows、標準ユーザー権限、高 DPI、複数ウィンドウで確認
6必要に応じて修正する登録時の cbClsExtra 確保、ポインターサイズ対応、状態管理の分離

ソースコードを検索できる場合は、まず以下の文字列を探すと効率的です。

GCL_CBCLSEXTRA
GCW_CBCLSEXTRA
GWW_CBCLSEXTRA
SetClassWord
SetClassLong
SetClassLongPtr
GetClassWord
GetClassLong
GetClassLongPtr
cbClsExtra
cbWndExtra
GWLP_USERDATA
GWL_USERDATA

検索結果が出たら、「何を保存しているか」「その値はサイズ情報なのか、ポインターなのか」「32bit / 64bit の両方で安全か」を確認します。

グローバル環境での注意点

グローバル企業では、国や拠点ごとに利用している業務アプリの世代が異なることがあります。日本本社では更新済みでも、海外拠点では古いクライアントアプリや古い周辺機器制御ソフトが残っているケースがあります。

確認時は、次の観点を入れると実態を把握しやすくなります。

観点確認内容
地域差海外拠点だけで使っている古い Windows アプリがないか
言語差日本語版では問題なくても、英語版・多言語版で UI 部品が異ならないか
OS 差Windows 10、Windows 11、Windows Server、VDI 環境で挙動が変わらないか
権限差管理者権限でしかテストしていない古いアプリがないか
供給元ベンダー製アプリの場合、64bit 対応状況と保守期限を確認しているか

今回の話題は、OS の地域設定や言語設定に直接依存するものではありません。ただし、グローバル運用では「古いアプリが一部拠点にだけ残る」ことが多いため、アプリ棚卸しの観点では重要です。

すぐに取るべき対応

今回の更新ポイントを踏まえると、Windows 管理者・開発者が取るべき対応は次のように整理できます。

立場すぐ行うこと優先度
Windows 管理者古い Win32 業務アプリの有無を棚卸しする
情報システム部門ベンダー製アプリの保守状況、64bit 対応状況を確認する
開発者GCL_CBCLSEXTRASetClassLongPtr 周辺の使い方をレビューする
アプリ移行担当32bit から 64bit への移行テストに extra bytes の観点を追加する
セキュリティ担当仕様外のメモリ利用や古い未保守アプリをリスク台帳に反映する

特に、これから Windows 11 への移行、VDI 更新、アプリの 64bit 化、古い C++ アプリのモダナイズを予定している組織では、今回の内容を「小さな互換性メモ」として流さず、コードレビュー項目に加えるのが現実的です。

まとめ:設定変更ではなく、古い実装を見つけるための更新ポイント

Windows の「A compatibility note on the abuse of Windows window class extra bytes」は、Windows 管理者がすぐに設定を変える類の更新ではありません。公式情報の中心は、過去のアプリが GWW_CBCLSEXTRA のような本来データ保存用ではない場所を private data の格納先として使っていた、という互換性上の注意点です。

実務で見るべきポイントは明確です。

まず、一般ユーザーや通常の Windows 運用では対応不要です。次に、古い Win32 アプリ、C / C++ 製の独自 UI、32bit から 64bit へ移行するアプリでは、cbClsExtraSetClassLongPtrGetClassLongPtrGCL_CBCLSEXTRA の使い方を確認します。そして、サイズ情報やシステム定義フィールドを独自データの隠し場所として使っている場合は、ドキュメントに沿った状態管理へ修正します。

次に取るべき行動は、Windows の設定変更ではなく、社内の古いデスクトップアプリを棚卸しし、該当 API の利用有無を確認することです。移行期限が示されていない今のうちに確認しておくことで、将来の Windows 更新、64bit 化、VDI 更新、セキュリティ強化のタイミングで予期しない互換性問題が発生するリスクを下げられます。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次