MFC ActiveX コントロールをスクリプトと初期化に安全としてマークする

この記事では、MFC ActiveX コントロールをスクリプトと初期化の安全なコントロールとしてマークする方法について説明します。

元の製品バージョン: MFC ActiveX コントロール
元の KB 番号: 161873

概要

既定では、MFC ActiveX コントロールは [スクリプトの安全] と [初期化のセーフ] としてマークされません。 これは、インターネット エクスプローラーでコントロールが実行され、セキュリティ レベルが中または高に設定されている場合に明らかになります。 これらのモードでは、コントロールのデータが安全ではないか、スクリプトを使用してもコントロールが安全でない可能性があることを示す警告が表示される場合があります。

コントロールでこれらのエラーを排除するために使用できるメソッドは 2 つあります。 1 つ目は、インターフェイスを IObjectSafety 実装するコントロールを含み、その動作を変更し、インターネット ブラウザーのコンテキストで実行すると安全になるコントロールに役立ちます。 2 つ目は、コントロールの DllRegisterServer 関数を変更して、レジストリでコントロールを安全にマークすることです。 この記事では、これらの方法の 2 つ目について説明します。 インターフェイスを実装する最初の IObjectSafety メソッドについては、Internet Client SDK で説明します。

コントロールは、実際には安全な場合にのみ安全としてマークする必要があることに注意してください。 この説明については、インターネット クライアント SDK のドキュメントを参照してください。 「コンポーネント開発」セクション の「ActiveX コントロールの安全な初期化とスクリプト 作成」を参照してください。

注:

この記事では、ダウンロードに安全なコントロールをマークする方法については説明しません。 コードのダウンロードとコード署名の詳細については、インターネット クライアント SDK を参照してください。

詳細

次の手順に従って、MFC ActiveX コントロールを [スクリプトの安全] と [初期化しても安全] としてマークします。

  1. 次の CreateComponentCategory cathelp.h ファイルと cathelp.cpp ファイルをプロジェクトに追加して、 および RegisterCLSIDInCategory ヘルパー関数を実装します。

    • Cathelp.h

      #include "comcat.h"
      
      // Helper function to create a component category and associated
      // description
      HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription);
      
      // Helper function to register a CLSID as belonging to a component
      // category
      HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid);
      
    • Cathelp.cpp

      #include "comcat.h"
      
      // Helper function to create a component category and associated
      // description
      HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription)
      {
          ICatRegister* pcr = NULL ;
          HRESULT hr = S_OK ;
      
          hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
          NULL,
          CLSCTX_INPROC_SERVER,
          IID_ICatRegister,
          (void**)&pcr);
          if (FAILED(hr))
          return hr;
      
          // Make sure the HKCR\Component Categories\{..catid...}
          // key is registered
          CATEGORYINFO catinfo;
          catinfo.catid = catid;
          catinfo.lcid = 0x0409 ; // english
      
          // Make sure the provided description is not too long.
          // Only copy the first 127 characters if it is
          int len = wcslen(catDescription);
          if (len>127)
          len = 127;
          wcsncpy(catinfo.szDescription, catDescription, len);
          // Make sure the description is null terminated
          catinfo.szDescription[len] = '\0';
      
          hr = pcr->RegisterCategories(1, &catinfo);
          pcr->Release();
      
          return hr;
      }
      
      // Helper function to register a CLSID as belonging to a component
      // category
      HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
      {
          // Register your component categories information.
          ICatRegister* pcr = NULL ;
          HRESULT hr = S_OK ;
          hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
          NULL,
          CLSCTX_INPROC_SERVER,
          IID_ICatRegister,
          (void**)&pcr);
          if (SUCCEEDED(hr))
          {
              // Register this category as being "implemented" by
              // the class.
              CATID rgcatid[1] ;
              rgcatid[0] = catid;
              hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);
          }
      
          if (pcr != NULL)
          pcr->Release();
      
          return hr;
      }
      
  2. コントロールを DllRegisterServer 安全としてマークするには、 を変更します。 プロジェクト内の DllRegisterServer .cpp ファイルで の実装を見つけます。 この.cpp ファイルにいくつかのことを追加する必要があります。 と RegisterCLSIDInCategoryを実装するファイルをCreateComponentCategory含めます。

    #include "CatHelp.h"
    

    安全コンポーネントカテゴリに関連付けられている GUID を定義します。

    const CATID CATID_SafeForScripting =
    {0x7dd95801,0x9882,0x11cf,{0x9f,0xa9,0x00,0xaa,0x00,0x6c,0x42,0xc4 }} ;
    const CATID CATID_SafeForInitializing =
    {0x7dd95802,0x9882,0x11cf,{0x9f,0xa9,0x00,0xaa,0x00,0x6c,0x42,0xc4 }} ;
    

    コントロールに関連付けられている GUID を定義します。 わかりやすくするために、コントロールのメイン .cpp ファイルのマクロから IMPLEMENT_OLECREATE_EX GUID を借りることができます。 次のように形式を少し調整します。

    const GUID CDECL BASED_CODE _ctlid =
    { 0x43bd9e45, 0x328f, 0x11d0,
    { 0xa6, 0xb9, 0x0, 0xaa, 0x0, 0xa7, 0xf, 0xc2 } };
    

    スクリプト作成と初期化の両方でコントロールを安全としてマークするには、関数を DllRegisterServer 次のように変更します。

    STDAPI DllRegisterServer(void)
    {
        AFX_MANAGE_STATE(_afxModuleAddrThis);
    
        if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
        return ResultFromScode(SELFREG_E_TYPELIB);
    
        if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
        return ResultFromScode(SELFREG_E_CLASS);
    
        if (FAILED( CreateComponentCategory(
        CATID_SafeForScripting,
        L"Controls that are safely scriptable")))
        return ResultFromScode(SELFREG_E_CLASS);
    
        if (FAILED( CreateComponentCategory(
        CATID_SafeForInitializing,
        L"Controls safely initializable from persistent data")))
        return ResultFromScode(SELFREG_E_CLASS);
    
        if (FAILED( RegisterCLSIDInCategory(
        _ctlid, CATID_SafeForScripting)))
        return ResultFromScode(SELFREG_E_CLASS);
    
        if (FAILED( RegisterCLSIDInCategory(
        _ctlid, CATID_SafeForInitializing)))
        return ResultFromScode(SELFREG_E_CLASS);
    
        return NOERROR;
    }
    

    通常、次の DllUnregisterServer 2 つの理由で関数を変更しません。

    • 他のコントロールがコンポーネント カテゴリを使用している可能性があるため、コンポーネント カテゴリを削除する必要はありません。

    • 関数が UnRegisterCLSIDInCategory 定義されていますが、既定では、レジストリからコントロールのエントリが完全に削除されます DllUnregisterServer 。 したがって、コントロールの登録からカテゴリを削除することはほとんど使用できません。

    コントロールをコンパイルして登録すると、レジストリに次のエントリが表示されます。

    • HKEY_CLASSES_ROOT\Component Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}

    • HKEY_CLASSES_ROOT\Component Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}

    • HKEY_CLASSES_ROOT\CLSID\{"your controls GUID"}\Implemented Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}

    • HKEY_CLASSES_ROOT\CLSID\{"your controls GUID"}\Implemented Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}

関連情報

インターネット クライアント SDK - コンポーネント開発 - ActiveX コントロールの安全な初期化とスクリプト