@prefix schema: <https://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ks: <https://comcomponent.com/vocab/> .

<https://comcomponent.com/blog/windows-shell-integration-context-menu-file-association/#article>
    schema:about <https://comcomponent.com/knowledge/file-association-progid/>, <https://comcomponent.com/knowledge/shell-verb/> ;
    schema:mentions <https://comcomponent.com/knowledge/hkey-classes-root/>, <https://comcomponent.com/knowledge/app-paths-registration/>, <https://comcomponent.com/knowledge/userchoice-protection/>, <https://comcomponent.com/knowledge/static-verb/>, <https://comcomponent.com/knowledge/icontextmenu-extension/>, <https://comcomponent.com/knowledge/iexplorercommand/>, <https://comcomponent.com/knowledge/win11-context-menu/>, <https://comcomponent.com/knowledge/msix-package-identity/>, <https://comcomponent.com/knowledge/sparse-package/>, <https://comcomponent.com/knowledge/shchangenotify/>, <https://comcomponent.com/knowledge/managed-code/>, <https://comcomponent.com/knowledge/windows-sandbox/>, <https://comcomponent.com/knowledge/wow6432node/>, <https://comcomponent.com/knowledge/ui-thread-context/>, <https://comcomponent.com/knowledge/group-policy/>, <https://comcomponent.com/knowledge/bitness-match-requirement/>, <https://comcomponent.com/knowledge/programmatic-default-change/>, <https://comcomponent.com/knowledge/default-apps-registration/>, <https://comcomponent.com/knowledge/association-change/> .

<https://comcomponent.com/knowledge/file-association-progid/> a skos:Concept ;
    skos:prefLabel "拡張子キーとProgID"@ja ;
    skos:definition "拡張子キーがProgIDを指すポインターで、ProgIDが実体としてverbやアイコンを持つ、ファイル関連付けの2段目までの構造。"@ja ;
    ks:uses <https://comcomponent.com/knowledge/shell-verb/> ;
    ks:verifiedBy <https://comcomponent.com/knowledge/hkey-classes-root/> .

<https://comcomponent.com/knowledge/shell-verb/> a skos:Concept ;
    skos:prefLabel "シェルのverb"@ja ;
    skos:definition "ProgID配下のshell\\<verb>\\commandが持つ動詞。open・edit・print・play・previewなどの標準verbはOSのロケールに応じた表示名が自動で付く。"@ja ;
    ks:requires <https://comcomponent.com/knowledge/static-verb/> .

<https://comcomponent.com/knowledge/hkey-classes-root/> a skos:Concept ;
    skos:prefLabel "HKEY_CLASSES_ROOT(合成ビュー)"@ja ;
    skos:definition "独立したハイブではなく、HKLM\\Software\\ClassesとHKCU\\Software\\Classesを重ねた合成ビュー。同じキーが両方にあればHKCU側が勝つ。"@ja ;
    skos:altLabel "HKCR" .

<https://comcomponent.com/knowledge/static-verb/> a skos:Concept ;
    skos:prefLabel "静的verb"@ja ;
    skos:definition "レジストリにコマンドラインを書くだけで実現する、最も単純なショートカットメニューの実装方式。"@ja ;
    ks:shouldPrecede <https://comcomponent.com/knowledge/icontextmenu-extension/> .

<https://comcomponent.com/knowledge/icontextmenu-extension/> a skos:Concept ;
    skos:prefLabel "従来型シェル拡張(IContextMenu)"@ja ;
    skos:definition "エクスプローラーや共通ファイルダイアログを開いた任意のアプリのプロセス内に読み込まれる、インプロセスCOMサーバー(DLL)として実装されるシェル拡張。"@ja ;
    ks:requires <https://comcomponent.com/knowledge/ui-thread-context/> ;
    ks:requires <https://comcomponent.com/knowledge/bitness-match-requirement/> .

<https://comcomponent.com/knowledge/default-apps-registration/> a skos:Concept ;
    skos:prefLabel "既定アプリ画面への登録"@ja ;
    skos:definition "RegisteredApplicationsとCapabilitiesによって、アプリを設定の「既定のアプリ」一覧の候補として登録すること。対応する形式はProgIDへの関連付けで宣言する。"@ja ;
    ks:requires <https://comcomponent.com/knowledge/file-association-progid/> .

<https://comcomponent.com/knowledge/userchoice-protection/> a skos:Concept ;
    skos:prefLabel "UserChoiceの保護"@ja ;
    skos:definition "ユーザーが明示的に選んだ既定アプリの結果を保持する設定と、その書き換えを阻む仕組み。データは難読化され、フィルタードライバーがアプリからの書き込みをブロックする。"@ja ;
    ks:prevents <https://comcomponent.com/knowledge/programmatic-default-change/> ;
    ks:configuredBy <https://comcomponent.com/knowledge/group-policy/> .

<https://comcomponent.com/knowledge/programmatic-default-change/> a skos:Concept ;
    skos:prefLabel "既定アプリの機械的な変更"@ja ;
    skos:definition "アプリがユーザーの操作を介さず、自らを拡張子の既定アプリに割り当てる行為。ユーザー設定の難読化とフィルタードライバーで防がれる。"@ja .

<https://comcomponent.com/knowledge/group-policy/> a skos:Concept ;
    skos:prefLabel "グループポリシー"@ja ;
    skos:definition "Active Directoryドメイン環境でWindowsの設定を集中構成する仕組み。"@ja ;
    skos:altLabel "GPO" ;
    skos:altLabel "Group Policy" .

<https://comcomponent.com/knowledge/ui-thread-context/> a skos:Concept ;
    skos:prefLabel "UIスレッドのコンテキスト"@ja ;
    skos:definition "WinForms/WPFなどデスクトップアプリで、UIの応答性を保つために画面更新や重い処理の実行場所として意識されるコンテキスト。"@ja ;
    skos:altLabel "UIイベントハンドラ"@ja .

<https://comcomponent.com/knowledge/bitness-match-requirement/> a skos:Concept ;
    skos:prefLabel "bitness一致要件"@ja ;
    skos:definition "ネイティブモジュール(in-procのCOMコンポーネント、P/Invokeで呼ぶDLL、ベンダー提供SDKのDLLなど)を読み込むホストプロセスと、そのモジュールのビット構成(32bit/64bit)が一致していなければならないという制約。"@ja ;
    skos:altLabel "32bit/64bitの一致"@ja ;
    skos:altLabel "bitness match" .

<https://comcomponent.com/knowledge/managed-code/> a skos:Concept ;
    skos:prefLabel "マネージコード(.NET)"@ja ;
    skos:definition "共通言語ランタイム上で動き、ガベージコレクションが寿命を管理するコード。"@ja ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/icontextmenu-extension/> .

<https://comcomponent.com/knowledge/iexplorercommand/> a skos:Concept ;
    skos:prefLabel "IExplorerCommand"@ja ;
    skos:definition "GetTitle・GetIcon・GetState・Invoke・EnumSubCommandsなどで構成される、Windows 11の新コンテキストメニュー向けのインターフェース。メソッドはUIスレッドで呼ばれる。"@ja ;
    ks:succeeds <https://comcomponent.com/knowledge/icontextmenu-extension/> ;
    ks:requires <https://comcomponent.com/knowledge/msix-package-identity/> .

<https://comcomponent.com/knowledge/win11-context-menu/> a skos:Concept ;
    skos:prefLabel "Windows 11の新コンテキストメニュー"@ja ;
    skos:definition "シェル標準コマンドの下にアプリのコマンドをグループ化する刷新された右クリックメニュー。従来型拡張は「その他のオプションを確認」の旧メニュー側に退避される。"@ja ;
    ks:requires <https://comcomponent.com/knowledge/iexplorercommand/> .

<https://comcomponent.com/knowledge/msix-package-identity/> a skos:Concept ;
    skos:prefLabel "MSIXのパッケージ識別"@ja ;
    skos:definition "MSIXマニフェストによって与えられるアプリの識別。新コンテキストメニューへの登録に必要になる。"@ja .

<https://comcomponent.com/knowledge/sparse-package/> a skos:Concept ;
    skos:prefLabel "外部の場所を指すpackaged(sparse package)"@ja ;
    skos:definition "既存のインストーラーをそのまま使いながら、実行ファイルにpackage identityだけを付与できるpackagingモデル。"@ja ;
    skos:altLabel "Sparse Package" ;
    ks:implements <https://comcomponent.com/knowledge/msix-package-identity/> .

<https://comcomponent.com/knowledge/association-change/> a skos:Concept ;
    skos:prefLabel "ファイル関連付けの変更"@ja ;
    skos:definition "拡張子とProgIDの対応やverbの登録内容を追加・変更・削除する操作。実行中のシェルに認識させるには変更通知が要る。"@ja ;
    ks:requires <https://comcomponent.com/knowledge/shchangenotify/> .

<https://comcomponent.com/knowledge/shchangenotify/> a skos:Concept ;
    skos:prefLabel "SHChangeNotify(SHCNE_ASSOCCHANGED)"@ja ;
    skos:definition "ファイル関連付けの変更をシステムへ通知し、シェルに変更を認識させる関数と通知イベント。"@ja .

<https://comcomponent.com/knowledge/windows-sandbox/> a skos:Concept ;
    skos:prefLabel "Windows サンドボックス"@ja ;
    skos:definition "使い捨てのクリーンなデスクトップ環境を数分で用意できる、Windows Pro/Enterprise/Education系で使えるホスト同系統の軽量な仮想化検証環境。"@ja ;
    skos:altLabel "Windows Sandbox" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/file-association-progid/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/shell-verb/> ;
    schema:description "拡張子キーはProgIDを指すポインターで、ProgIDが実体としてshell\\<verb>\\commandにコマンドラインを持つ。コマンド文字列でスペースを含み得る要素は引用符で囲む必要があり、\"%1\"は常に引用符で囲む。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/shell/fa-file-types>, <https://learn.microsoft.com/windows/win32/shell/fa-verbs> ;
    ks:verifiedAt "2026-08-20" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/file-association-progid/> ;
    rdf:predicate ks:verifiedBy ;
    rdf:object <https://comcomponent.com/knowledge/hkey-classes-root/> ;
    schema:description "HKCRはHKLM\\Software\\ClassesとHKCU\\Software\\Classesを合成したビューで、ユーザー側の定義がマシン側より優先される。登録はHKLMかHKCUを明示して書き、HKCRは読み取り用と割り切る。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/sysinfo/hkey-classes-root-key>, <https://learn.microsoft.com/windows/win32/shell/fa-file-types> ;
    ks:verifiedAt "2026-08-22" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/shell-verb/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/static-verb/> ;
    schema:description "既定verbはshellキーの既定値→レジストリ上の最初のverb→open→openwithの順で決まる。標準verbの表示名はOSが供給する。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/shell/context-menu-handlers> ;
    ks:verifiedAt "2026-08-20" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/static-verb/> ;
    rdf:predicate ks:shouldPrecede ;
    rdf:object <https://comcomponent.com/knowledge/icontextmenu-extension/> ;
    schema:description "要件を満たす最も単純な静的verb方式から検討すべきとされており、IContextMenuは最も強力だが最も複雑な選択肢に位置づけられている。「このアプリで開く」を実現したいだけならシェル拡張DLLは要らない。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/shell/shortcut-choose-method> ;
    ks:verifiedAt "2026-08-22" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/default-apps-registration/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/file-association-progid/> ;
    schema:description "App Pathsサブキーによる実行ファイルの登録が推奨され、Applicationsサブキーが「プログラムから開く」での既定の開き方と表示名を定義し、RegisteredApplicationsとCapabilitiesが既定アプリ設定画面への候補登録を担う。ProgIDだけ登録してCapabilities登録を省くと一覧に出てこない。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/shell/app-registration> ;
    ks:verifiedAt "2026-08-22" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/userchoice-protection/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/programmatic-default-change/> ;
    schema:description "拡張子キーの既定値にProgIDを書いても既定アプリになるとは限らない。既定アプリの変更はシステム設定UIを通じてのみ行える設計で、ユーザー設定データは難読化され、フィルタードライバーがアプリからの書き込みをブロックする。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/apps/develop/windows-integration/default-apps-platform> ;
    ks:verifiedAt "2026-08-22" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/userchoice-protection/> ;
    rdf:predicate ks:configuredBy ;
    rdf:object <https://comcomponent.com/knowledge/group-policy/> ;
    schema:description "管理環境では、既定アプリの割り当てはグループポリシー/MDMポリシーが公式の手段になる。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/apps/develop/windows-integration/default-apps-platform> ;
    ks:verifiedAt "2026-08-20" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/icontextmenu-extension/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/ui-thread-context/> ;
    schema:description "シェル拡張はエクスプローラー(およびシェルをホストするプロセス)に読み込まれるインプロセスCOM DLLで、メニュー構築はUIスレッドで行われる。ネットワークアクセスやファイルI/Oのような遅い処理をメニュー表示時に行ってはいけない。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/shell/shell-exts> ;
    ks:verifiedAt "2026-08-20" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/icontextmenu-extension/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/bitness-match-requirement/> ;
    schema:description "インプロセスDLLは読み込むプロセスとビット数が一致しなければならず、64bit Windowsのエクスプローラーは64bitプロセスなので32bitだけのDLLは読み込まれずメニューに現れない。COM登録も32bit分はWOW6432Node側に分かれる。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/shell/shell-exts> ;
    ks:verifiedAt "2026-08-22" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/managed-code/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/icontextmenu-extension/> ;
    schema:description "マネージコードによるインプロセスのシェル拡張実装は推奨されずサポート対象外とされている。実務の指針は、インプロセス拡張はネイティブC++で書き、マネージコードを使うならverbのcommandで起動する通常のEXEか別プロセスで動くアウトプロセス拡張にすることである。CLRのバージョン競合、ロック待ちでのメッセージループ再入、ガベージコレクションによる寿命の非決定性がCOMの参照カウント契約と衝突するためである。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/shell/shell-and-managed-code> ;
    ks:verifiedAt "2026-08-22" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/iexplorercommand/> ;
    rdf:predicate ks:succeeds ;
    rdf:object <https://comcomponent.com/knowledge/icontextmenu-extension/> ;
    schema:description "従来型のIContextMenuベースのシェル拡張は削除されたのではなく、「その他のオプションを確認」で開く、Windows 10のメニューをそのまま読み込んだ旧メニュー側に退避された。"@ja ;
    ks:evidence <https://blogs.windows.com/windowsdeveloper/2021/07/19/extending-the-context-menu-and-share-dialog-in-windows-11/> ;
    ks:verifiedAt "2026-08-22" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/win11-context-menu/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/iexplorercommand/> ;
    schema:description "新メニューに独自コマンドを出す公式ルートは、IExplorerCommandを実装したネイティブDLLを用意することである。メソッドはUIスレッドで呼ばれる。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/apps/desktop/modernize/integrate-packaged-app-with-file-explorer>, <https://learn.microsoft.com/windows/win32/api/shobjidl_core/nn-shobjidl_core-iexplorercommand> ;
    ks:verifiedAt "2026-08-20" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/iexplorercommand/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/msix-package-identity/> ;
    schema:description "新メニューへの登録は、MSIXパッケージのマニフェストでCOMサーバーとコンテキストメニュー拡張を宣言する形で行う。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/apps/desktop/modernize/integrate-packaged-app-with-file-explorer> ;
    ks:verifiedAt "2026-08-20" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/sparse-package/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/msix-package-identity/> ;
    schema:description "既存インストーラを変えずに、外部ロケーション付きパッケージで非パッケージアプリへ識別だけを与えられる。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/apps/desktop/modernize/grant-identity-to-nonpackaged-apps-overview> ;
    ks:verifiedAt "2026-08-20" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/association-change/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/shchangenotify/> ;
    schema:description "関連付けを変更したらSHChangeNotifyでSHCNE_ASSOCCHANGEDを発行し、シェルへ変更を認識させる。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/api/shlobj_core/nf-shlobj_core-shchangenotify>, <https://learn.microsoft.com/windows/win32/shell/fa-file-types> ;
    ks:verifiedAt "2026-08-22" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/file-association-progid/> ;
    rdf:predicate ks:verifiedBy ;
    rdf:object <https://comcomponent.com/knowledge/windows-sandbox/> ;
    schema:description "使い捨ての隔離されたWindows環境を数秒で起動でき、閉じるとすべての変更が破棄されるため、登録と解除の検証に向く。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/security/application-security/application-isolation/windows-sandbox/> ;
    ks:verifiedAt "2026-08-22" ;
    ks:certainty "context-dependent" .
