Win32 API 日本語リファレンス
ホームSystem.Com › COINIT

COINIT

列挙型フラグ
基底型i4

メンバー 4

名前10進16進説明
COINIT_APARTMENTTHREADED20x2アパートメント スレッドのオブジェクト並行性用にスレッドを初期化します (「解説」を参照してください)。
COINIT_MULTITHREADED00x0マルチスレッドのオブジェクト並行性用にスレッドを初期化します (「解説」を参照してください)。
COINIT_DISABLE_OLE1DDE40x4OLE1 サポートのための DDE を無効にします。
COINIT_SPEED_OVER_MEMORY80x8パフォーマンスを向上させるために、メモリ使用量を増やします。

公式ドキュメント

このスレッドによって作成されたオブジェクトへの受信呼び出しに使用される並行性モデルを決定します。この並行性モデルは、アパートメント スレッドまたはマルチスレッドのいずれかです。

解説(Remarks)

スレッドが CoInitializeEx の呼び出しによって初期化されるとき、COINIT のメンバーのいずれかを 2 番目のパラメーターとして指定することで、そのスレッドをアパートメント スレッドとして初期化するか、マルチスレッドとして初期化するかを選択します。これにより、そのスレッドによって作成されたオブジェクトへの受信呼び出しがどのように処理されるか、つまりオブジェクトの並行性が決まります。

アパートメント スレッドは、複数の実行スレッドを許容しつつ、このスレッドによって作成されたオブジェクトのメソッドへの呼び出しが常に同じスレッド、すなわちそれらを作成したアパートメント/スレッド上で実行されることを要求することによって、すべての受信呼び出しを直列化します。さらに、呼び出しはメッセージ キューの境界でのみ到着します。この直列化のため、他のメソッドの呼び出しや同じアパートメント/スレッド内の他のオブジェクトへの呼び出しによって中断されてはならない処理の間に PeekMessageSendMessage を呼び出さないようにすること以外は、通常、オブジェクトのコードに並行性制御を記述する必要はありません。

マルチスレッド (フリー スレッドとも呼ばれます) では、このスレッドによって作成されたオブジェクトのメソッドへの呼び出しを任意のスレッド上で実行できます。呼び出しの直列化は行われません。つまり、同じメソッドや同じオブジェクトに対して多数の呼び出しが同時に発生する可能性があります。マルチスレッドのオブジェクト並行性は、オブジェクトへの呼び出しがまったく直列化されないため、最も高いパフォーマンスを提供し、スレッド間、プロセス間、およびマシン間の呼び出しにおいてマルチプロセッサー ハードウェアを最大限に活用します。ただしこれは、オブジェクトのコードが、クリティカル セクション、セマフォ、ミューテックスなどの同期プリミティブを使用して、独自の並行性モデルを自ら適用しなければならないことを意味します。さらに、オブジェクトは自身にアクセスするスレッドの有効期間を制御しないため、スレッド固有の状態をオブジェクト内 (スレッド ローカル ストレージ) に格納することはできません。

メモ  マルチスレッド アパートメントは、GUI 以外のスレッドで使用することを目的としています。マルチスレッド アパートメント内のスレッドは、UI の操作を行わないでください。これは、UI スレッドにはメッセージ ポンプが必要であるのに対し、COM はマルチスレッド アパートメント内のスレッドに対してメッセージをポンプしないためです。
 
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

列挙メンバーの定義。HSP タブは #define global(値は16進)。

typedef enum COINIT : int {
    COINIT_APARTMENTTHREADED = 2,
    COINIT_MULTITHREADED = 0,
    COINIT_DISABLE_OLE1DDE = 4,
    COINIT_SPEED_OVER_MEMORY = 8
} COINIT;
[Flags]
public enum COINIT : int
{
    COINIT_APARTMENTTHREADED = 2,
    COINIT_MULTITHREADED = 0,
    COINIT_DISABLE_OLE1DDE = 4,
    COINIT_SPEED_OVER_MEMORY = 8,
}
<Flags>
Public Enum COINIT As Integer
    COINIT_APARTMENTTHREADED = 2
    COINIT_MULTITHREADED = 0
    COINIT_DISABLE_OLE1DDE = 4
    COINIT_SPEED_OVER_MEMORY = 8
End Enum
import enum

class COINIT(enum.IntFlag):
    COINIT_APARTMENTTHREADED = 2
    COINIT_MULTITHREADED = 0
    COINIT_DISABLE_OLE1DDE = 4
    COINIT_SPEED_OVER_MEMORY = 8
// COINIT (flags)
pub const COINIT_APARTMENTTHREADED: i32 = 2;
pub const COINIT_MULTITHREADED: i32 = 0;
pub const COINIT_DISABLE_OLE1DDE: i32 = 4;
pub const COINIT_SPEED_OVER_MEMORY: i32 = 8;
// COINIT
const (
	COINIT_APARTMENTTHREADED int32 = 2
	COINIT_MULTITHREADED int32 = 0
	COINIT_DISABLE_OLE1DDE int32 = 4
	COINIT_SPEED_OVER_MEMORY int32 = 8
)
const
  COINIT_APARTMENTTHREADED = 2;
  COINIT_MULTITHREADED = 0;
  COINIT_DISABLE_OLE1DDE = 4;
  COINIT_SPEED_OVER_MEMORY = 8;
// COINIT
pub const COINIT_APARTMENTTHREADED: i32 = 2;
pub const COINIT_MULTITHREADED: i32 = 0;
pub const COINIT_DISABLE_OLE1DDE: i32 = 4;
pub const COINIT_SPEED_OVER_MEMORY: i32 = 8;
const
  COINIT_APARTMENTTHREADED* = 2
  COINIT_MULTITHREADED* = 0
  COINIT_DISABLE_OLE1DDE* = 4
  COINIT_SPEED_OVER_MEMORY* = 8
enum COINIT : int {
    COINIT_APARTMENTTHREADED = 2,
    COINIT_MULTITHREADED = 0,
    COINIT_DISABLE_OLE1DDE = 4,
    COINIT_SPEED_OVER_MEMORY = 8,
}
#define global COINIT_APARTMENTTHREADED 0x2
#define global COINIT_MULTITHREADED     0x0
#define global COINIT_DISABLE_OLE1DDE   0x4
#define global COINIT_SPEED_OVER_MEMORY 0x8
; ※フラグ列挙型。ビットORで組み合わせ可(例: FOO|BAR)。