CTF フラグ
呼び出し元関数の動作を制御するフラグ。 SHCreateThread および SHCreateThreadWithHandle によって使用されます。 これらの関数では、これらの値は SHCT_FLAGS 型として定義されます。
定数/値 | 説明 |
---|---|
|
0x00000001。
CreateThread を使用してスレッドを作成しようとすると、このフラグを設定すると、pfnThreadProc が指す関数が呼び出し元のスレッドから同期的に呼び出されます。 このフラグは、 pfnCallback が NULL の場合にのみ使用できます。 |
|
0x00000002。
pfnThreadProc が指す関数の呼び出しの間、作成中のスレッドへの参照を保持します。 この参照は 、SHSetThreadRef で設定されている必要があります。 |
|
0x00000004。
pfnThreadProc が指す関数の呼び出しの間、Windows エクスプローラー プロセスへの参照を保持します。 このフラグは、Windows エクスプローラー プロセスが途中で閉じないようにする必要があるシェル拡張ハンドラーに役立ちます。 このアクションは、バックグラウンド スレッドでの作業やファイルのコピーなどのタスク中に役立ちます。 詳細については、「 SHGetInstanceExplorer」を参照してください。 |
|
0x00000008。
pfnCallback によって指される省略可能な関数または pfnThreadProc によって指される関数を呼び出す前に、作成されたスレッドの COM をシングル スレッド アパートメント (STA) として初期化します。 このフラグは、スレッドに対して COM を初期化する必要がある場合に便利です。 COM も自動的に初期化されません。 |
|
CTF_COINIT_STAと同じです。 |
|
0x00000010。
インターネット エクスプローラー 6 以降。LoadLibrary は、pfnThreadProc 関数を含む DLL で呼び出され、アンロードされないようにします。
pfnThreadProc が返されると、DLL は FreeLibrary で解放され、DLL 参照カウントがデクリメントされます。 DLL が途中でアンロードされないようにするには、このフラグを渡します。たとえば、 CoFreeUnusedLibraries の場合です。 このフラグが渡された場合、 pfnThreadProc 関数は DLL 内に存在する必要があることに注意してください。 このフラグは、Windows Vista 以降では暗黙的です。 |
|
0x00000020。 インターネット エクスプローラー 6 以降。 作成されたスレッドに対してスレッド参照が自動的に作成され、 SHSetThreadRef で設定されます。
pfnThreadProc が戻ると、スレッド参照が解放され、スレッド参照の参照カウントがゼロにドロップされるまで、つまり、作成されたスレッドに依存するスレッドが参照を解放するまで、メッセージが送信されます。 |
|
0x00000040。 インターネット エクスプローラー 6 以降。 呼び出し元のスレッドは COM メッセージと SendMessage メッセージを待機してポンプします。 同期プロシージャが SendMessage を使用して、呼び出し元スレッドでホストされているウィンドウに Windows メッセージを送信しようとすると、メッセージは正常に到着します。 同期プロシージャが COM を使用して呼び出し元スレッドでホストされている STA オブジェクトと通信しようとすると、関数呼び出しは目的のオブジェクトに正常に到達します。 呼び出し元のスレッドは、脆弱さを再び開始するために開かれています。 呼び出し元のスレッドは同期プロシージャによる SendMessage と COM の使用を処理できますが、他のスレッドが SendMessage または COM を使用して呼び出し元スレッドでホストされているオブジェクトと通信している場合、同期プロシージャの完了中に処理される予期しないメッセージまたは関数呼び出しである可能性があります。 |
|
0x00000080。 インターネット エクスプローラー 7 以降。 使用されていません。 |
|
0x00000100。 インターネット エクスプローラー 7 以降。 新しいスレッドは、ファイル システム リダイレクターの Windows on-Windows 64 ビット (WOW64) 無効化状態を継承します。 |
|
0x00000200。 Windows Vista 以降。 呼び出し元のスレッドは、同期プロシージャが新しいスレッドで実行されるのを待っている間、他のすべてのプロセスをブロックします。 同期プロシージャが SendMessage を含む Windows メッセージを呼び出し元のスレッドでホストされているウィンドウに送信しようとすると、同期プロシージャがデッドロックします。 同期プロシージャが COM を使用して呼び出し元スレッドでホストされている STA オブジェクトと通信しようとすると、同期プロシージャもデッドロックします。 呼び出し元のスレッドは、このフラグを指定することで、再入に関するすべての問題から保護されます。 |
|
0x00000400。 Windows 7 以降。 生成する新しいスレッドの元のスレッドのキーボード ロケールを使用します。 |
|
0x00000800。 Windows 7 以降。 作成されたスレッドのシングル スレッド アパートメント (STA) モデルを使用して COM を初期化します。 |
|
0x00001000。
Windows 7 以降。 作成されたスレッドのマルチスレッド アパートメント (MTA) モデルを使用して COM を初期化します。 |
|
0x00002000。 Windows 7 以降。 このフラグは基本的にCTF_FREELIBANDEXITの反対です。 これにより 、LoadLibrary/FreeLibraryAndExitThread 呼び出しが回避され、ローダー ロックの競合が発生する可能性があります。 CTF_NOADDREFLIBを使用するのは、新しいスレッドが元のスレッド プロシージャのコードを確実に読み込み続けることを意味する場合のみです。 COM オブジェクトは DLL の読み込み状態を維持する必要があるため、この値は COM オブジェクトのコンテキストでは使用しないでください (通常、COM は DLL をアンロードします)。 |
注釈
CTF_WAIT_ フラグが指定されていない場合、呼び出し元のスレッドは SendMessage メッセージを待機して送信します。 同期プロシージャが SendMessage を含む Windows メッセージを呼び出し元のスレッドでホストされているウィンドウに送信しようとすると、メッセージは目的のウィンドウに移動します。 同期プロシージャが COM を使用して呼び出し元スレッドでホストされている STA オブジェクトと通信しようとすると、同期プロシージャはデッドロックします。 呼び出し元のスレッドは、脆弱さを再び開始するために開かれています。 呼び出し元のスレッドは同期プロシージャによる SendMessage の使用を処理できますが、他のスレッドが SendMessage を使用して呼び出し元スレッドでホストされているウィンドウと通信する場合、これらのメッセージは予期しない可能性があります。 これにより、同期プロシージャの実行中に処理される可能性があります。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント |
Windows 2000 Professional、Windows XP、Windows 7 [デスクトップ アプリのみ] |
サポートされている最小のサーバー |
Windows 2000 Server [デスクトップ アプリのみ] |
ヘッダー |
|