@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/2026/01/31/000-sta-mta-com-relationship/#article>
    schema:about <https://comcomponent.com/knowledge/sta/>, <https://comcomponent.com/knowledge/mta/> ;
    schema:mentions <https://comcomponent.com/knowledge/com-apartment-model/>, <https://comcomponent.com/knowledge/com/>, <https://comcomponent.com/knowledge/com-marshaling/>, <https://comcomponent.com/knowledge/proxy-stub/>, <https://comcomponent.com/knowledge/idispatch/>, <https://comcomponent.com/knowledge/com-automation/>, <https://comcomponent.com/knowledge/midl/>, <https://comcomponent.com/knowledge/message-loop/>, <https://comcomponent.com/knowledge/coinitializeex/>, <https://comcomponent.com/knowledge/stathread-attribute/>, <https://comcomponent.com/knowledge/threadingmodel-registry/>, <https://comcomponent.com/knowledge/windows-forms/>, <https://comcomponent.com/knowledge/dotnet/>, <https://comcomponent.com/knowledge/thread-safe-com-object/>, <https://comcomponent.com/knowledge/sta-hang/>, <https://comcomponent.com/knowledge/msgwaitformultipleobjects/>, <https://comcomponent.com/knowledge/sta-callback-deadlock/> .

<https://comcomponent.com/knowledge/sta/> a skos:Concept ;
    skos:prefLabel "STA(Single-Threaded Apartment)"@ja ;
    skos:definition "1スレッドに1つのApartmentが対応し、そのApartment内のCOMオブジェクトは基本的に生成したスレッドでのみ実行されるCOMのスレッドモデル。"@ja ;
    skos:altLabel "シングルスレッドアパートメント"@ja ;
    skos:altLabel "Single-Threaded Apartment" ;
    skos:broader <https://comcomponent.com/knowledge/com-apartment-model/> ;
    ks:requires <https://comcomponent.com/knowledge/message-loop/> .

<https://comcomponent.com/knowledge/mta/> a skos:Concept ;
    skos:prefLabel "MTA(Multi-Threaded Apartment)"@ja ;
    skos:definition "複数のスレッドが1つのApartmentを共有し、どのスレッドからでも直接呼び出せるが、オブジェクト側にスレッドセーフ設計を要求するCOMのスレッドモデル。"@ja ;
    skos:altLabel "マルチスレッドアパートメント"@ja ;
    skos:altLabel "Multi-Threaded Apartment" ;
    skos:broader <https://comcomponent.com/knowledge/com-apartment-model/> ;
    ks:requires <https://comcomponent.com/knowledge/thread-safe-com-object/> .

<https://comcomponent.com/knowledge/com/> a skos:Concept ;
    skos:prefLabel "COM(コンポーネントオブジェクトモデル)"@ja ;
    skos:definition "公開インターフェース、レジストリ登録、Apartment Modelなどを土台にした、Windowsのバイナリ互換コンポーネントモデル。"@ja ;
    skos:altLabel "Component Object Model" ;
    ks:uses <https://comcomponent.com/knowledge/com-apartment-model/> .

<https://comcomponent.com/knowledge/com-apartment-model/> a skos:Concept ;
    skos:prefLabel "COMアパートメントモデル(STA/MTA)"@ja ;
    skos:definition "どのスレッドからCOMコンポーネントを呼んでよいかを決める、COMのスレッドモデルの約束。"@ja ;
    skos:altLabel "STA" ;
    skos:altLabel "MTA" ;
    skos:altLabel "Single/Multi Threaded Apartment" ;
    skos:broader <https://comcomponent.com/knowledge/com/> ;
    ks:requires <https://comcomponent.com/knowledge/coinitializeex/> .

<https://comcomponent.com/knowledge/coinitializeex/> a skos:Concept ;
    skos:prefLabel "CoInitializeEx"@ja ;
    skos:definition "COMを使う各スレッドが個別に呼んで初期化する必要があるWin32 API。"@ja .

<https://comcomponent.com/knowledge/message-loop/> a skos:Concept ;
    skos:prefLabel "メッセージループ"@ja ;
    skos:definition "スレッドがGetMessage/DispatchMessageなどで自分のウィンドウ宛てのメッセージを順に取り出し処理し続ける仕組み。入力・描画・イベント処理を担うと同時に、STAが持つOleMainThreadWndClassという隠しウィンドウ宛てに届く、別アパートメントからの呼び出しメッセージもここでディスパッチされる。"@ja ;
    skos:altLabel "OleMainThreadWndClass" ;
    skos:broader <https://comcomponent.com/knowledge/com-apartment-model/> ;
    ks:prevents <https://comcomponent.com/knowledge/sta-hang/> .

<https://comcomponent.com/knowledge/proxy-stub/> a skos:Concept ;
    skos:prefLabel "Proxy/Stub"@ja ;
    skos:definition "マーシャリングを担当する一組の部品。呼び出す側に立つProxyと、呼ばれる側で受け取った呼び出しを本物のオブジェクトへ渡すStubからなる。"@ja ;
    ks:implements <https://comcomponent.com/knowledge/com-marshaling/> .

<https://comcomponent.com/knowledge/thread-safe-com-object/> a skos:Concept ;
    skos:prefLabel "スレッドセーフなCOMオブジェクト設計"@ja ;
    skos:definition "複数スレッドから同時に呼び出されても内部状態が壊れないよう実装された、MTAで動作するCOMオブジェクトに求められる設計。"@ja .

<https://comcomponent.com/knowledge/windows-forms/> a skos:Concept ;
    skos:prefLabel "Windows Forms"@ja ;
    skos:definition "デスクトップGUIアプリケーションを構築するための.NET/.NET FrameworkのUIフレームワーク。"@ja ;
    skos:altLabel "WinForms" ;
    ks:uses <https://comcomponent.com/knowledge/message-loop/> .

<https://comcomponent.com/knowledge/stathread-attribute/> a skos:Concept ;
    skos:prefLabel ".NETの[STAThread]/[MTAThread]属性"@ja ;
    skos:definition "エントリポイントに付与してそのスレッドのCOM Apartmentを設定する.NETの属性・仕組み。実際にCOMを呼ぶまでは初期化されず、追加で作るスレッドには効かない。"@ja ;
    skos:altLabel "STAThread" ;
    skos:altLabel "ApartmentState" ;
    ks:uses <https://comcomponent.com/knowledge/coinitializeex/> ;
    ks:requires <https://comcomponent.com/knowledge/com-apartment-model/> .

<https://comcomponent.com/knowledge/threadingmodel-registry/> a skos:Concept ;
    skos:prefLabel "ThreadingModelレジストリ値"@ja ;
    skos:definition "HKEY_CLASSES_ROOT\\CLSID\\{CLSID}\\InprocServer32に登録される、COMクラスが要求するApartmentの種類(Apartment/Both/Free等)を示すレジストリ値。"@ja ;
    skos:altLabel "ThreadingModel" .

<https://comcomponent.com/knowledge/com-automation/> a skos:Concept ;
    skos:prefLabel "Automation"@ja ;
    skos:definition "IDispatchと、そこで使える限られたデータ型を前提にしたCOMの使い方の総称。この範囲に収まっていれば、マーシャリングはOS側のoleaut32.dllが引き受ける。"@ja ;
    skos:altLabel "OLE Automation" ;
    ks:uses <https://comcomponent.com/knowledge/idispatch/> ;
    ks:implements <https://comcomponent.com/knowledge/com-marshaling/> .

<https://comcomponent.com/knowledge/idispatch/> a skos:Concept ;
    skos:prefLabel "IDispatch"@ja ;
    skos:definition "メソッド名を文字列で問い合わせて番号で呼び出すためのCOMインターフェース。スクリプト言語やVBAからのCOM利用を可能にする。"@ja .

<https://comcomponent.com/knowledge/midl/> a skos:Concept ;
    skos:prefLabel "MIDL"@ja ;
    skos:definition "インターフェース定義(.idl)からProxy/Stubのコードなどを生成する、Microsoftのコンパイラ。"@ja ;
    skos:altLabel "Microsoft Interface Definition Language" .

<https://comcomponent.com/knowledge/sta-hang/> a skos:Concept ;
    skos:prefLabel "STAのハング(呼び出し転送の停止)"@ja ;
    skos:definition "別スレッドからの呼び出しを受けるSTAスレッドがメッセージループを回していないため、呼び出しの転送を受け取れず、呼び出し元とSTAスレッドの双方が待ち続ける状態。"@ja ;
    skos:altLabel "STA Hang" .

<https://comcomponent.com/knowledge/msgwaitformultipleobjects/> a skos:Concept ;
    skos:prefLabel "MsgWaitForMultipleObjects"@ja ;
    skos:definition "メッセージと同期オブジェクトの両方を待てるWin32 API。独自のメッセージループを書かずに、終了通知を受けつつCOMの呼び出しも取りこぼさない待機に使う。"@ja .

<https://comcomponent.com/knowledge/sta-callback-deadlock/> a skos:Concept ;
    skos:prefLabel "同期呼び出し中のコールバックによるデッドロック"@ja ;
    skos:definition "STAスレッドが同期呼び出しの戻りを待っている間はメッセージを処理できないため、その最中にサーバーからコールバックが来ると、呼び出し元とサーバーが互いを待ち続けて進まなくなる状態。"@ja .

<https://comcomponent.com/knowledge/dotnet/> a skos:Concept ;
    skos:prefLabel ".NET(Core以降)"@ja ;
    skos:definition ".NET Frameworkの後継となる、クロスプラットフォーム対応の.NETランタイム(.NET 5以降)。"@ja ;
    skos:altLabel ".NET Core" ;
    skos:altLabel "モダンな.NET"@ja .

<https://comcomponent.com/knowledge/com-marshaling/> a skos:Concept ;
    skos:prefLabel "マーシャリング"@ja ;
    skos:definition "プロセス境界だけでなく、同一プロセス内のCOMアパートメント境界やマネージド/ネイティブ境界のような呼び出し境界を越えて、引数や戻り値をやり取りできる形に詰め直すこと。"@ja ;
    skos:altLabel "marshaling" ;
    skos:altLabel "Marshaling" ;
    skos:altLabel "Marshalling" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/com/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/com-apartment-model/> ;
    schema:description "COMは、どのスレッドからコンポーネントを呼んでよいかを決めるApartment Modelを土台にする。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/com/com-apartments> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/com-apartment-model/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/coinitializeex/> ;
    schema:description "スレッドのApartmentは、CoInitializeExをCOINIT_APARTMENTTHREADEDまたはCOINIT_MULTITHREADEDで呼んだ瞬間に決まる。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/api/objbase/nf-objbase-coinitializeex> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/sta/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/message-loop/> ;
    schema:description "各STAは、他のプロセスや同一プロセス内の他のApartmentからの呼び出しを処理するために、メッセージループを持たなければならない。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/com/single-threaded-apartments> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/sta/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/proxy-stub/> ;
    schema:description "Apartmentを跨ぐ呼び出しは、COMがProxy/Stubを使って転送する。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/com/com-apartments> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/mta/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/thread-safe-com-object/> ;
    schema:description "MTA内のCOMオブジェクトは複数スレッドから同時に呼び出されるため、オブジェクト側にスレッドセーフ設計が必須になる。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/com/multithreaded-apartments> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/windows-forms/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/sta/> ;
    schema:description "エントリポイントに[STAThread]が付いているか、明示的にSetApartmentState(STA)を呼んでいる場合、WinForms/WPFのUIスレッドはSTAとして初期化され、UIコントロールの1スレッド親和性と一致する。既定のテンプレートは属性を付けるが、独自のエントリポイントで付け忘れるとMTAのままになる"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.windows.forms.application.run> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/windows-forms/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/message-loop/> ;
    schema:description "UIスレッドはウィンドウイベントを処理するために必ずメッセージループを回しており、STAの前提を追加実装なしで満たす。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.windows.forms.application.run> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/stathread-attribute/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/coinitializeex/> ;
    schema:description ".NETの[STAThread]属性は、COMのApartment初期化(CoInitializeExに相当する処理)を設定するためのラッパーである。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.stathreadattribute> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/threadingmodel-registry/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/sta/> ;
    schema:description "ThreadingModelがApartmentとして登録されたCOMクラスは、生成したSTAスレッドで呼び出しが処理されることを前提とする。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/com/inprocserver32> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/com-automation/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/idispatch/> ;
    schema:description "AutomationはIDispatchと、そこで使える限られたデータ型を前提にしたCOMの使い方である。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/com/automation> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/proxy-stub/> ;
    rdf:predicate ks:configuredBy ;
    rdf:object <https://comcomponent.com/knowledge/midl/> ;
    schema:description "IUnknown直接派生のカスタムインターフェースでは、MIDLでProxy/Stubのコードを生成・登録する必要がある。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/midl/microsoft-interface-definition-language> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/sta/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/sta-hang/> ;
    schema:description "別スレッドから呼ばれるSTAスレッドがメッセージループを回していないと、呼び出しの転送を受け取れずハングする。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/com/single-threaded-apartments> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/message-loop/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/sta-hang/> ;
    schema:description "STAスレッドがメッセージループを回していれば、転送された呼び出しのメッセージを受け取って実行に回せる。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/com/single-threaded-apartments> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/msgwaitformultipleobjects/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/sta-hang/> ;
    schema:description "メッセージと同期オブジェクトを同時に待つことで、独自のメッセージループを書かずに、転送される呼び出しを取りこぼさずに済む。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/api/winuser/nf-winuser-msgwaitformultipleobjects> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/sta/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/sta-callback-deadlock/> ;
    schema:description "STAスレッドが同期呼び出しの戻りを待っている間にサーバーからコールバックが来ると、互いに相手の完了を待ち続けてデッドロックになることがある。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/com/single-threaded-apartments> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dotnet/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/sta-hang/> ;
    schema:description ".NETでSTAスレッドをTask.Wait()やManualResetEvent.WaitOne()などでブロックすると、COMのコールバックやApartmentをまたぐ呼び出しが完了できずデッドロックになる。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/com/single-threaded-apartments> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/mta/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/proxy-stub/> ;
    schema:description "MTAのスレッドが別ApartmentのCOMオブジェクトを呼ぶ場合も、COMがProxy/Stubを使って転送する。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/com/com-apartments> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/stathread-attribute/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/com-apartment-model/> ;
    schema:description ".NETの[STAThread]/[MTAThread]属性やApartmentStateは、COMのApartment Modelを設定するためのラッパーであり、.NETのSTA/MTAはCOMのSTA/MTAそのものである。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/com/com-apartments> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/proxy-stub/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/com-marshaling/> ;
    schema:description "Proxy/Stubは、マーシャリングを実際に担う一組の部品である。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/com/com-apartments> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/com-automation/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/com-marshaling/> ;
    schema:description "Automationの範囲に収まっていれば、マーシャリングは専用のProxy/Stubを作らずOS側のoleaut32.dllが引き受ける。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/com/automation> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .
