MFC ActiveX-besturingselementen markeren als veilig voor scripting en initialisatie
In dit artikel wordt beschreven hoe u MFC ActiveX-besturingselementen markeert als Veilig voor scripting en initialisatie.
Oorspronkelijke productversie: MFC ActiveX-besturingselementen
Origineel KB-nummer: 161873
Samenvatting
Standaard zijn MFC ActiveX-besturingselementen niet gemarkeerd als Veilig voor scripting en Veilig voor initialisatie. Dit wordt duidelijk wanneer het besturingselement wordt uitgevoerd in Internet Explorer met het beveiligingsniveau ingesteld op gemiddeld of hoog. In een van deze modi kunnen waarschuwingen worden weergegeven dat de gegevens van het besturingselement niet veilig zijn of dat het besturingselement mogelijk niet veilig is voor scripts om te gebruiken.
Er zijn twee methoden die een besturingselement kan gebruiken om deze fouten te elimineren. De eerste betreft het besturingselement dat de IObjectSafety
interface implementeert en is handig voor besturingselementen die hun gedrag willen wijzigen en veilig willen worden als ze worden uitgevoerd in de context van een internetbrowser. De tweede omvat het wijzigen van de functie van DllRegisterServer
het besturingselement om het besturingselement veilig in het register te markeren. In dit artikel wordt de tweede van deze methoden behandeld. De eerste methode, het implementeren van de IObjectSafety
interface, wordt behandeld in de INTERNET Client SDK.
Houd er rekening mee dat een besturingselement alleen als veilig moet worden gemarkeerd als het in feite veilig is. Raadpleeg de documentatie van de Internet Client SDK voor een beschrijving hiervan. Zie Veilige initialisatie en scripts voor ActiveX-besturingselementen in de sectie Onderdeelontwikkeling.
Opmerking
In dit artikel wordt niet beschreven hoe u een besturingselement kunt markeren als veilig voor downloaden. Raadpleeg de Internet Client SDK voor meer informatie over het downloaden van code en het ondertekenen van code.
Meer informatie
Volg deze stappen om uw MFC ActiveX-besturingselement te markeren als Veilig voor scripting en Veilig voor initialisatie:
Implementeer de
CreateComponentCategory
helperfuncties enRegisterCLSIDInCategory
door de volgende cathelp.h- en cathelp.cpp-bestanden toe te voegen aan uw project.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; }
Wijzig de
DllRegisterServer
om het besturingselement als veilig te markeren. Zoek de implementatie vanDllRegisterServer
in een .cpp-bestand in uw project. U moet verschillende dingen toevoegen aan dit .cpp-bestand. Neem het bestand op dat wordtCreateComponentCategory
geïmplementeerd enRegisterCLSIDInCategory
:#include "CatHelp.h"
Definieer de GUID die is gekoppeld aan de categorieën van veiligheidsonderdelen:
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 }} ;
Definieer de GUID die is gekoppeld aan uw besturingselement. Voor het gemak kunt u de GUID lenen van de
IMPLEMENT_OLECREATE_EX
macro in het hoofdbestand .cpp voor het besturingselement. Pas de indeling enigszins aan zodat deze er als volgt uitziet:const GUID CDECL BASED_CODE _ctlid = { 0x43bd9e45, 0x328f, 0x11d0, { 0xa6, 0xb9, 0x0, 0xaa, 0x0, 0xa7, 0xf, 0xc2 } };
Als u het besturingselement wilt markeren als Veilig voor script en initialisatie, wijzigt u de
DllRegisterServer
functie als volgt: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; }
Normaal gesproken wijzigt u de
DllUnregisterServer
functie niet om de volgende twee redenen:U wilt een onderdeelcategorie niet verwijderen omdat deze mogelijk door andere besturingselementen wordt gebruikt.
Hoewel er een
UnRegisterCLSIDInCategory
functie is gedefinieerd, wordt de vermelding van het besturingselement standaardDllUnregisterServer
volledig uit het register verwijderd. Daarom heeft het weinig zin om de categorie uit de registratie van het besturingselement te verwijderen.
Nadat u uw besturingselement hebt gemaakt en geregistreerd, vindt u de volgende vermeldingen in het register:
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}
Verwijzingen
Internet Client SDK - Onderdeelontwikkeling - Veilige initialisatie en scripting voor ActiveX-besturingselementen
Feedback
https://aka.ms/ContentUserFeedback.
Binnenkort beschikbaar: In de loop van 2024 zullen we GitHub-problemen geleidelijk uitfaseren als het feedbackmechanisme voor inhoud en deze vervangen door een nieuw feedbacksysteem. Zie voor meer informatie:Feedback verzenden en weergeven voor