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:
Implementieren Sie die
CreateComponentCategory
Hilfsfunktionen undRegisterCLSIDInCategory
, 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; }
Ändern Sie den
DllRegisterServer
, um das Steuerelement als sicher zu markieren. Suchen Sie die Implementierung vonDllRegisterServer
in einer .cpp-Datei in Ihrem Projekt. Sie müssen dieser .cpp Datei mehrere Elemente hinzufügen. Schließen Sie die Datei ein, die undRegisterCLSIDInCategory
implementiertCreateComponentCategory
:#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äßigDllUnregisterServer
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
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für