次の方法で共有


OLE コントロールの登録

OLE コントロールは、他の OLE サーバー オブジェクトと同様に、他の OLE 対応アプリケーションからアクセスできます。 これは、コントロールのタイプ ライブラリとクラスを登録することによって実現されます。

次の関数を使用すると、Windows 登録データベースにコントロールのクラス、プロパティ ページ、およびタイプ ライブラリを追加および削除できます。

OLE コントロールの登録

名前 説明
AfxOleRegisterControlClass 登録データベースにコントロールのクラスを追加します。
AfxOleRegisterPropertyPageClass 登録データベースにコントロール プロパティ ページを追加します。
AfxOleRegisterTypeLib コントロールのタイプ ライブラリを登録データベースに追加します。
AfxOleUnregisterClass 登録データベースからコントロール クラスまたはプロパティ ページ クラスを削除します。
AfxOleUnregisterTypeLib 登録データベースからコントロールのタイプ ライブラリを削除します。

AfxOleRegisterTypeLib は、通常、 DllRegisterServerのコントロール DLL の実装で呼び出されます。 同様に、 AfxOleUnregisterTypeLibDllUnregisterServerによって呼び出されます。 AfxOleRegisterControlClassAfxOleRegisterPropertyPageClass、および AfxOleUnregisterClass は、通常、コントロールのクラス ファクトリまたはプロパティ ページの UpdateRegistry メンバー関数によって呼び出されます。

AfxOleRegisterControlClass

コントロール クラスを Windows 登録データベースに登録します。

BOOL AFXAPI AfxOleRegisterControlClass(
    HINSTANCE hInstance,
    REFCLSID clsid,
    LPCTSTR pszProgID,
    UINT idTypeName,
    UINT idBitmap,
    int nRegFlags,
    DWORD dwMiscStatus,
    REFGUID tlid,
    WORD wVerMajor,
    WORD wVerMinor);

パラメーター

hinstance
コントロール クラスに関連付けられているモジュールのインスタンス ハンドル。

clsid
コントロールの一意のクラス ID。

pszProgID
コントロールの一意のプログラム ID。

idTypeName
コントロールのユーザーが読み取り可能な型名を含む文字列のリソース ID。

idBitmap
ツール バーまたはパレットで OLE コントロールを表すために使用されるビットマップのリソース ID。

nRegFlags
次のフラグの 1 つ以上が含まれています。

  • afxRegInsertable OLE オブジェクトの [オブジェクトの挿入] ダイアログ ボックスにコントロールを表示できるようにします。

  • afxRegApartmentThreading レジストリ内のスレッド モデルを ThreadingModel=Apartment に設定します。

  • afxRegFreeThreading レジストリ内のスレッド モデルを ThreadingModel=Free に設定します。

    2 つのフラグ afxRegApartmentThreadingafxRegFreeThreading を組み合わせて ThreadingModel=Both を設定できます。 スレッド モデルの登録の詳細については、Windows SDK の InprocServer32 を参照してください。

Note

MFC 4.2 より前の MFC バージョンでは、 int nRegFlags パラメーターは BOOL パラメーター bInsertable で、[オブジェクトの挿入] ダイアログ ボックスからのコントロールの挿入を許可または禁止していました。

dwMiscStatus
次の 1 つ以上の状態フラグが含まれています (フラグの説明については、Windows SDK の OLEMISC 列挙型を参照してください)。

  • OLEMISC_RECOMPOSEONRESIZE

  • OLEMISC_ONLYICONIC

  • OLEMISC_INSERTNOTREPLACE

  • OLEMISC_STATIC

  • OLEMISC_CANTLINKINSIDE

  • OLEMISC_CANLINKBYOLE1

  • OLEMISC_ISLINKOBJECT

  • OLEMISC_INSIDEOUT

  • OLEMISC_ACTIVATEWHENVISIBLE

  • OLEMISC_RENDERINGISDEVICEINDEPENDENT

  • OLEMISC_INVISIBLEATRUNTIME

  • OLEMISC_ALWAYSRUN

  • OLEMISC_ACTSLIKEBUTTON

  • OLEMISC_ACTSLIKELABEL

  • OLEMISC_NOUIACTIVATE

  • OLEMISC_ALIGNABLE

  • OLEMISC_IMEMODE

  • OLEMISC_SIMPLEFRAME

  • OLEMISC_SETCLIENTSITEFIRST

tlid
コントロール クラスの一意の ID。

wVerMajor
コントロール クラスのメジャー バージョン番号。

wVerMinor
コントロール クラスのマイナー バージョン番号。

戻り値

コントロール クラスが登録されている場合は 0 以外。それ以外の場合は 0。

解説

これにより、OLE コントロールに対応するコンテナーでコントロールを使用できます。 AfxOleRegisterControlClass は、システム上のコントロールの名前と場所を使用してレジストリを更新し、コントロールがレジストリでサポートするスレッド モデルも設定します。 詳細については、Windows SDK の「 テクニカル ノート 64、「OLE コントロールのアパートメント モデルスレッド」、および「 プロセスとスレッド 」を参照してください。

// Member function implementation of class COleObjectFactory::UpdateRegistry
//
BOOL CMyAxCtrl::CMyAxCtrlFactory::UpdateRegistry(BOOL bRegister)
{
   // TODO: Verify that your control follows apartment-model threading rules.
   // Refer to MFC TechNote 64 for more information.
   // If your control does not conform to the apartment-model rules, then
   // you must modify the code below, changing the 6th parameter from
   // afxRegInsertable | afxRegApartmentThreading to afxRegInsertable.

   if (bRegister)
      return AfxOleRegisterControlClass(
          AfxGetInstanceHandle(),
          m_clsid,
          m_lpszProgID,
          IDS_NVC_MFCAXCTL,
          IDB_NVC_MFCAXCTL,
          afxRegInsertable | afxRegApartmentThreading,
          _dwMyOleMisc,
          _tlid,
          _wVerMajor,
          _wVerMinor);
   else
      return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
}

上の例では、挿入可能なフラグとアパートメント モデルの ORed のフラグを一緒に使用して 6 番目のパラメーターを作成する AfxOleRegisterControlClass を呼び出す方法を示します。

afxRegInsertable | afxRegApartmentThreading,

このコントロールは、有効なコンテナーの [オブジェクトの挿入] ダイアログ ボックスに表示され、アパートメント モデルに対応します。 アパートメント モデル対応コントロールでは、静的クラス データがロックによって保護されていることを確認する必要があります。そのため、あるアパートメントのコントロールが静的データにアクセスしている間は、スケジューラによって無効にされず、同じクラスの別のインスタンスが同じ静的データの使用を開始します。 静的データへのアクセスはすべて、重要なセクション コードで囲まれます。

要件

Header afxctl.h

AfxOleRegisterPropertyPageClass

プロパティ ページ クラスを Windows 登録データベースに登録します。

BOOL AFXAPI AfxOleRegisterPropertyPageClass(
   HINSTANCE hInstance,
   REFCLSID  clsid,
   UINT idTypeName,
   int nRegFlags);

パラメーター

hinstance
プロパティ ページ クラスに関連付けられているモジュールのインスタンス ハンドル。

clsid
プロパティ ページの一意のクラス ID。

idTypeName
プロパティ ページのユーザーが読み取り可能な名前を含む文字列のリソース ID。

nRegFlags
フラグを含む場合があります。

  • afxRegApartmentThreading レジストリ内のスレッド モデルを ThreadingModel = Apartment に設定します。

Note

MFC 4.2 より前のバージョンの MFC では、 int nRegFlags パラメーターを使用できませんでした。 また、 afxRegInsertable フラグはプロパティ ページの有効なオプションではなく、設定されている場合は MFC で ASSERT が発生します。

戻り値

コントロール クラスが登録されている場合は 0 以外。それ以外の場合は 0。

解説

これにより、OLE コントロール対応のコンテナーでプロパティ ページを使用できます。 AfxOleRegisterPropertyPageClass は、プロパティ ページ名とシステム上の場所を使用してレジストリを更新し、コントロールがレジストリでサポートするスレッド モデルも設定します。 詳細については、Windows SDK の「 テクニカル ノート 64、「OLE コントロールのアパートメント モデルスレッド」、および「 プロセスとスレッド 」を参照してください。

要件

Header afxctl.h

AfxOleRegisterTypeLib

タイプ ライブラリを Windows 登録データベースに登録し、OLE コントロール対応の他のコンテナーでタイプ ライブラリを使用できるようにします。

BOOL AfxOleRegisterTypeLib(
    HINSTANCE hInstance,
    REFGUID tlid,
    LPCTSTR pszFileName = NULL,
    LPCTSTR pszHelpDir  = NULL);

パラメーター

hinstance
タイプ ライブラリに関連付けられているアプリケーションのインスタンス ハンドル。

tlid
タイプ ライブラリの一意の ID。

pszFileName
ローカライズされたタイプ ライブラリ (.コントロールの TLB) ファイル。

pszHelpDir
タイプ ライブラリのヘルプ ファイルが見つかるディレクトリの名前。 NULL の場合、ヘルプ ファイルはタイプ ライブラリ自体と同じディレクトリ内にあると見なされます。

戻り値

タイプ ライブラリが登録されている場合は 0 以外。それ以外の場合は 0。

解説

この関数は、タイプ ライブラリ名とシステム上の場所を使用してレジストリを更新します。

// Type library guid definition.
const GUID CDECL BASED_CODE _tlid =
{ 0x77E58ED8, 0xA2C0, 0x4C13, { 0xB6, 0xC1, 0xBA, 0xD1, 0x19, 0xAF, 0xE3, 0xF1 } };

 

// Registers type library and the interfaces
// in it, afxctl.h needs to be included
if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
return ResultFromScode(SELFREG_E_TYPELIB);


// CMFCAutomation.tlb should be in the same directory as exe module.
// last param can be null if help file associated w/ tlb is in same dir as .tlb
if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid,
   _T("CMFCAutomation.tlb"), NULL))
{
   return ResultFromScode(SELFREG_E_TYPELIB);
}

要件

Header afxdisp.h

AfxOleUnregisterClass

Windows 登録データベースからコントロールまたはプロパティ ページ クラスエントリを削除します。

BOOL AFXAPI AfxOleUnregisterClass(REFCLSID clsID, LPCSTR pszProgID);

パラメーター

clsID
コントロールまたはプロパティ ページの一意のクラス ID。

pszProgID
コントロールまたはプロパティ ページの一意のプログラム ID。

戻り値

コントロールまたはプロパティ ページ クラスが正常に登録解除された場合は 0 以外。それ以外の場合は 0。

要件

Header afxctl.h

AfxOleUnregisterTypeLib

この関数を呼び出して、Windows 登録データベースからタイプ ライブラリ エントリを削除します。

BOOL AFXAPI AfxOleUnregisterTypeLib(REFGUID tlID);

パラメーター

tlID
タイプ ライブラリの一意の ID。

戻り値

タイプ ライブラリの登録が正常に解除された場合は 0 以外。それ以外の場合は 0。

// Type library GUID, corresponds to the uuid attribute of the library
// section in the .odl file.
const GUID CDECL BASED_CODE _tlid =
    {0xA44774E8, 0xAE00, 0x451F, {0x96, 0x1D, 0xC7, 0xD2, 0xD2, 0x58, 0xA0, 0x75}};

// Type library major version number, number on the left of decimal
// point, in version attribute of the library section in .odl file.
const WORD _wVerMajor = 1;

// Type library minor version number, number on the right of decimal
// point, in version attribute of the library section in .odl file.
const WORD _wVerMinor = 0;

STDAPI DllUnregisterServer(void)
{
   AFX_MANAGE_STATE(_afxModuleAddrThis);

   if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))
      return ResultFromScode(SELFREG_E_TYPELIB);

   if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))
      return ResultFromScode(SELFREG_E_CLASS);

   return NOERROR;
}

要件

Header afxdisp.h

関連項目

マクロとグローバル