このテクニカル ノートでは、スレッドのアパートメント モデルの ActiveX コントロールを有効にする方法について説明します。アパートメント モデルのスレッドが Visual C のバージョン 4.2 またはそれ以降でのみサポートされていることに注意してください。
アパートメント モデルのスレッドは何です。?
アパートメント モデル、マルチ スレッドのコンテナー アプリケーション内の ActiveX コントロールなどの埋め込みオブジェクトをサポートするためのアプローチです。アプリケーションが複数のスレッドがあるありますが、「は 1 つだけのスレッドで実行される 1 つアパートメント」に埋め込みオブジェクトの各インスタンスが割り当てられます。他の言葉では、コントロールのインスタンスのすべての呼び出しが同じスレッドで発生します。
ただし、別のインスタンスが同じ種類のコントロールの異なるアパートメントに割り当てることができます。一般的な (静的またはグローバル データなど) 内のデータは、コントロールの複数のインスタンスを共有する場合は、[この共有データにアクセスするクリティカル セクションなどの同期オブジェクトによって保護する必要があります。
アパートメント スレッド モデルの詳細についてを参照してください プロセスとスレッド、 OLE プログラマ リファレンス。
なぜサポート アパートメント モデルのスレッド?
アパートメント モデルのスレッドをサポートするコントロールは、アパートメント モデルをサポートするマルチ スレッド コンテナー アプリケーションで使用することができます。アパートメント モデルのスレッドを有効にしない場合は、コンテナーのコントロールが使用することの潜在的なセットを制限します。
アパートメント モデルのスレッドを有効にする場合は特に彼らはほとんどあるいは全くの共有データがあるほとんどのコントロールでは、簡単です。
共有データの保護
共有データ コントロールを使用する場合、静的メンバー変数などにデータを 1 つ以上のスレッドと同時に、データを変更することから防ぐために、クリティカル セクションを保護することにアクセスします。この目的のため、重要なセクションを設定するには、コントロールのクラスの方式 CCriticalSectionクラスの静的メンバー変数を宣言します。どこにあなたのコードが共有データにアクセス、このクリティカル セクション オブジェクトのロックとロック解除のメンバー関数を使用します。
たとえば、すべてのインスタンスで共有して、文字列を維持する必要があるコントロール クラスを考えてみます。この文字列は、静的メンバー変数で管理でき、クリティカル セクションによって保護します。コントロールのクラス宣言は、以下が含まれます:
cSampleCtrl クラス: パブリック COleControl{特価;...静的 CString _strShared;静的方式 CCriticalSection _critSect;}(&N)
クラスの実装がこれらの変数の定義が含まれます:
int CString CSampleCtrl::_strShared;方式 CCriticalSection CSampleCtrl::_critSect
アクセス、 _strShared 静的メンバーは、クリティカル セクションによって保護されてすることができます:
void CSampleCtrl::SomeMethod(){特価;_critSect.Lock();場合 (_strShared.Empty())_strShared ="<text>";_critSect.Unlock();...}
アパートメント モデル対応コントロールの登録
アパートメント モデルのスレッドをサポートするコントロールのクラス ID レジストリ エントリクラス idの下で"ThreadingModel"「アパート」値を持つ名前付き値を追加することによってこの機能レジストリを示す必要があります \InprocServer32キー。あなたのコントロールを自動的に登録するには、このキーが発生するには、渡す、 afxRegApartmentThreading フラグは、6 番目のパラメーター AfxOleRegisterControlClassに:
BOOL CSampleCtrl::CSampleCtrlFactory::UpdateRegistry(BOOL bRegister){特価;場合 (bRegister)AfxOleRegisterControlClass (を返すAfxGetInstanceHandle()、m_clsid、m_lpszProgID、IDS_SAMPLE、IDB_SAMPLE、afxRegApartmentThreading、_dwSampleOleMisc、_tlid、_wVerMajor、_wVerMinor);他AfxOleUnregisterClass (m_clsid, m_lpszProgID); を返す}(&N)
コントロール プロジェクトを Visual C 4.1 またはそれ以降のバージョンに ControlWizard によって生成された場合は、このフラグはすでにあなたのコードで表示されます。変更、スレッド モデルを登録する必要はありません。
プロジェクト ウィザードの以前のバージョンで生成された場合は、既存のコードは、6 番目のパラメーターとしてブール値必要があります。既存のパラメーターが TRUE の場合は、それを変更 afxRegInsertable | afxRegApartmentThreading 。既存のパラメーターが FALSE の場合は、それを変更します。 afxRegApartmentThreading。
コントロールにアパートメント モデルのスレッド処理の規則に従っていない場合は、渡しませんする必要があります afxRegApartmentThreading このパラメーター。
番号順テクニカル ノート|nbsp;カテゴリ別テクニカル ノート(&N)