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:
Implementieren Sie die
CreateComponentCategoryFunktionen undRegisterCLSIDInCategoryHilfsfunktionen, 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; }
Ändern Sie die
DllRegisterServerEigenschaft, um das Steuerelement als sicher zu markieren. Suchen Sie die Implementierung einerDllRegisterServerCPP-Datei in Ihrem Projekt. Sie müssen dieser CPP-Datei mehrere Dinge hinzufügen. Schließen Sie die Datei ein, die implementiertCreateComponentCategorywird, undRegisterCLSIDInCategory:#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_EXMakro 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
DllRegisterServerFunktion 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
DllUnregisterServerfolgenden beiden Gründen nicht ändern:Sie möchten eine Komponentenkategorie nicht entfernen, da sie möglicherweise von anderen Steuerelementen verwendet wird.
Obwohl eine
UnRegisterCLSIDInCategoryFunktion definiert ist, wird der Eintrag des Steuerelements standardmäßigDllUnregisterServervollstä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