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

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

Originalversion des Produkts:   MFC-ActiveX-Steuerelemente
Ursprüngliche KB-Nummer:   161873

Zusammenfassung

Standardmäßig sind MFC-ActiveX-Steuerelemente nicht als Tresor für Skripting und Tresor für die Initialisierung gekennzeichnet. Dies wird deutlich, wenn das Steuerelement im Internet Explorer ausgeführt wird und 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 möglicherweise nicht sicher ist.

Es gibt zwei Methoden, die ein Steuerelement verwenden kann, um diese Fehler zu beseitigen. Die erste betrifft 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. Im zweiten Abschnitt wird die Funktion des Steuerelements DllRegisterServer geändert, um das Steuerelement in der Registrierung als sicher zu kennzeichnen. In diesem Artikel wird die zweite dieser Methoden behandelt. Die erste Methode, die Implementierung der IObjectSafety Schnittstelle, wird im Internet Client SDK behandelt.

Denken Sie daran, 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 Tresor Initialisierung und Skripterstellung für ActiveX Steuerelemente im Abschnitt "Komponentenentwicklung".

Hinweis

In diesem Artikel wird nicht behandelt, wie ein Steuerelement zum Herunterladen als sicher markiert wird. 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 Tresor für Skripting und Tresor für die Initialisierung zu markieren:

  1. Implementieren Sie die CreateComponentCategory Funktionen und RegisterCLSIDInCategory Hilfsfunktionen, indem Sie ihrem 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 die DllRegisterServer Eigenschaft, um das Steuerelement als sicher zu markieren. Suchen Sie die Implementierung einer DllRegisterServer CPP-Datei in Ihrem Projekt. Sie müssen dieser CPP-Datei mehrere Dinge hinzufügen. Schließen Sie die Datei ein, die implementiert CreateComponentCategory wird, und RegisterCLSIDInCategory:

    #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 CPP-Hauptdatei für das Steuerelement leihen. 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 } };
    

    Ändern Sie die DllRegisterServer Funktion wie folgt, um Ihr Steuerelement als Tresor für Skripting und Initialisierung zu markieren:

    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 Funktion aus den DllUnregisterServer 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.

    Nach dem Kompilieren und Registrieren des Steuerelements 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

InternetClient SDK – Komponentenentwicklung – Tresor Initialisierung und Skripterstellung für ActiveX-Steuerelemente