Markieren von MFC-ActiveX-Steuerelementen als sicher für Skripterstellung und Initialisierung

In diesem Artikel wird beschrieben, wie Sie MFC-ActiveX-Steuerelemente als sicher für Skripterstellung und Initialisierung markieren.

Ursprüngliche Produktversion: MFC-ActiveX-Steuerelemente
Ursprüngliche KB-Nummer: 161873

Zusammenfassung

Standardmäßig sind MFC-ActiveX-Steuerelemente nicht als sicher für Skripterstellung und sicher für die Initialisierung gekennzeichnet. Dies wird deutlich, wenn das Steuerelement im Internet Explorer ausgeführt wird, wobei die Sicherheitsstufe auf mittel oder hoch festgelegt ist. In einem dieser Modi werden möglicherweise Warnungen angezeigt, dass die Daten des Steuerelements nicht sicher sind oder dass das Steuerelement für skripts nicht sicher ist.

Es gibt zwei Methoden, die ein Steuerelement verwenden kann, um diese Fehler zu beseitigen. Die erste umfasst das Steuerelement, das die IObjectSafety -Schnittstelle implementiert und ist nützlich für Steuerelemente, die ihr Verhalten ändern und sicher werden möchten, wenn sie im Kontext eines Internetbrowsers ausgeführt werden. Die zweite umfasst das Ändern der -Funktion des Steuerelements DllRegisterServer , um das Steuerelement in der Registrierung als sicher zu markieren. In diesem Artikel wird die zweite dieser Methoden behandelt. Die erste Methode, die Implementierung der IObjectSafety Schnittstelle, wird im Internet Client SDK behandelt.

Beachten Sie, dass ein Steuerelement nur dann als sicher gekennzeichnet werden sollte, wenn es tatsächlich sicher ist. Eine Beschreibung finden Sie in der Dokumentation zum Internet Client SDK. Weitere Informationen finden Sie unter Sichere Initialisierung und Skripterstellung für ActiveX-Steuerelemente im Abschnitt Komponentenentwicklung.

Hinweis

In diesem Artikel wird nicht behandelt, wie Sie ein Steuerelement als sicher für den Download markieren. Weitere Informationen zum Herunterladen und Signieren von Code finden Sie im Internet Client SDK.

Weitere Informationen

Führen Sie die folgenden Schritte aus, um Ihr MFC-ActiveX-Steuerelement als sicher für Skripterstellung und Sicher für die Initialisierung zu markieren:

  1. Implementieren Sie die CreateComponentCategory Hilfsfunktionen und RegisterCLSIDInCategory , indem Sie dem Projekt die folgenden Dateien cathelp.h und cathelp.cpp hinzufügen.

    • 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. Ändern Sie den DllRegisterServer , um das Steuerelement als sicher zu markieren. Suchen Sie die Implementierung von DllRegisterServer in einer .cpp-Datei in Ihrem Projekt. Sie müssen dieser .cpp Datei mehrere Elemente hinzufügen. Schließen Sie die Datei ein, die und RegisterCLSIDInCategoryimplementiertCreateComponentCategory:

    #include "CatHelp.h"
    

    Definieren Sie die GUID, die den Sicherheitskomponentenkategorien zugeordnet ist:

    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 }} ;
    

    Definieren Sie die GUID, die Ihrem Steuerelement zugeordnet ist. Der Einfachheit halber können Sie die GUID aus dem IMPLEMENT_OLECREATE_EX Makro in der Standard .cpp-Datei für das Steuerelement ausleihen. Passen Sie das Format leicht an, sodass es wie folgt aussieht:

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

    Um Ihr Steuerelement sowohl als sicher für Skripterstellung als auch als Initialisierung zu kennzeichnen, ändern Sie die DllRegisterServer Funktion wie folgt:

    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;
    }
    

    Normalerweise würden Sie die DllUnregisterServer Funktion aus den folgenden beiden Gründen nicht ändern:

    • Sie möchten eine Komponentenkategorie nicht entfernen, da sie möglicherweise von anderen Steuerelementen verwendet wird.

    • Obwohl eine UnRegisterCLSIDInCategory Funktion definiert ist, wird der Eintrag des Steuerelements standardmäßig DllUnregisterServer vollständig aus der Registrierung entfernt. Daher ist das Entfernen der Kategorie aus der Registrierung des Steuerelements wenig von Nutzen.

    Nachdem Sie Ihr Steuerelement kompiliert und registriert haben, sollten Sie die folgenden Einträge in der Registrierung finden:

    • 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}

References

Internet Client SDK – Komponentenentwicklung – Sichere Initialisierung und Skripterstellung für ActiveX-Steuerelemente