So markieren Sie MFC-ActiveX-Steuerelemente als sicher für Skripting und Initialisierung

Zusammenfassung

Standardmäßig sind MFC-ActiveX-Steuerelemente nicht als sicher für Skripts und für die Initialisierung sicher markiert. Dies wird deutlich, wenn das Steuerelement im Internet Explorer ausgeführt wird und die Sicherheitsstufe auf Mittel oder hoch festgesetzt ist. In einem dieser Modi können Warnungen angezeigt werden, dass die Daten des Steuerelements nicht sicher sind oder dass das Steuerelement möglicherweise nicht für Skripts sicher ist. Es gibt zwei Methoden, die ein Steuerelement verwenden kann, um diese Fehler zu vermeiden. Der erste umfasst das Steuerelement, das die IObjectSafety-Schnittstelle implementiert, und eignet sich für Steuerelemente, die ihr Verhalten ändern und "sicher" werden möchten, wenn Sie im Kontext eines Internet Browsers ausgeführt werden. Die zweite umfasst die Änderung der DllRegisterServer-Funktion des Steuerelements, um das Steuerelement "sicher" in der Registrierung zu markieren. In diesem Artikel wird die zweite dieser Methoden behandelt. Die erste Methode, die die IObjectSafety-Schnittstelle implementiert, wird im Internet Client SDK behandelt. Bitte beachten Sie, dass ein Steuerelement nur dann als sicher markiert werden sollte, wenn es tatsächlich sicher ist. Eine Beschreibung hierzu 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 ein Steuerelement für den Download sicher markiert wird. Weitere Informationen zum Codedownload und zur Codesignierung finden Sie im Internet Client SDK.

Weitere Informationen

Führen Sie die folgenden Schritte aus, um das MFC-ActiveX-Steuerelement als sicher für Skripting und sicheres initialisieren zu kennzeichnen:

  1. Implementieren Sie die CreateComponentCategory-und RegisterCLSIDInCategory-Hilfsfunktionen, indem Sie dem Projekt die folgenden cathelp. h-und cathelp. cpp-Dateien 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, um das Steuerelement als sicher zu kennzeichnen. Suchen Sie die Implementierung von DllRegisterServer in einer CPP-Datei in Ihrem Projekt. Sie müssen dieser cpp-Datei mehrere Elemente hinzufügen. Fügen Sie die Datei ein, die CreateComponentCategory und RegisterCLSIDInCategory implementiert:

          #include "CatHelp.h"

    Definieren Sie die GUID, die den Sicherheitskomponenten Kategorien 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 dem Steuerelement zugeordnet ist. Aus Gründen der Einfachheit können Sie die GUID aus dem IMPLEMENT_OLECREATE_EX -Makro in der Datei "Main. cpp" für das Steuerelement ausleihen. Passen Sie das Format etwas an, damit es wie folgt aussieht:

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

    Wenn Sie das Steuerelement sowohl für die Skripterstellung als auch für die Initialisierung als sicher kennzeichnen möchten, ändern Sie die Funktion DllRegisterServer 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;      }

Sie würden die DllUnregisterServer-Funktion normalerweise aus zwei Gründen nicht ändern:

  • Sie möchten eine Komponentenkategorie nicht entfernen, weil Sie von anderen Steuerelementen verwendet werden kann.

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

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}

Informationsquellen

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

Benötigen Sie weitere Hilfe?

Ihre Office-Fähigkeiten erweitern
Schulungen erkunden
Neue Funktionen als Erster erhalten
Microsoft Insider beitreten

War diese Information hilfreich?

Vielen Dank für Ihr Feedback!

Vielen Dank für Ihr Feedback. Es klingt, als ob es hilfreich sein könnte, Sie mit einem unserer Office-Supportmitarbeiter zu verbinden.

×