英語で読む

次の方法で共有


CTF フラグ

呼び出し元関数の動作を制御するフラグ。 SHCreateThread および SHCreateThreadWithHandle によって使用されます。 これらの関数では、これらの値は SHCT_FLAGS 型として定義されます。

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