De ActiveX-besturingselementen van MFC als veilig markeren voor het uitvoeren van scripts en initialisatie

Samenvatting

De ActiveX-besturingselementen van MFC worden standaard niet aangemerkt als veilig voor het uitvoeren van scripts en veilig voor initialisatie. Dit wordt weergeven als het besturingselement in Internet Explorer wordt uitgevoerd en het beveiligingsniveau is ingesteld op normaal of hoog. In een van deze modi wordt er mogelijk een waarschuwing weergegeven dat de gegevens van het besturingselement niet veilig zijn en dat het besturingselement mogelijk niet veilig is voor gebruik van scripts. U kunt op twee manieren een besturingselement gebruiken om de fouten op te lossen. Het eerste is een besturingselement waarbij de IObjectSafety-interface wordt geïmplementeerd en geschikt is voor besturingselementen die hun gedrag willen wijzigen en ' veilig ' kunnen worden uitgevoerd in de context van een Internet browser. De tweede verandering moet de functie DllRegisterServer van het besturingselement wijzigen om het besturingselement ' veilig ' in het register te markeren. Dit artikel heeft betrekking op de tweede van deze methoden. De eerste methode voor het implementeren van de IObjectSafety-interface valt onder de Internet Client SDK. Houd er rekening mee dat een besturingselement slechts veilig moet worden gemarkeerd als veilig. Raadpleeg de documentatie voor de Internet Client SDK voor een beschrijving hiervan. Zie ' veilige initialisatie en uitvoeren van scripts voor ActiveX-besturingselementen ' onder de sectie onderdeel ontwikkeling.Opmerking In dit artikel wordt uitgelegd hoe u een besturingselement veilig kunt markeren voor downloaden. Raadpleeg voor meer informatie over het downloaden van code en ondertekening van code de Internet Client SDK.

Meer informatie

Voer de volgende stappen uit om uw MFC ActiveX-besturingselement als veilig te markeren voor het uitvoeren van scripts en voor de veiligheid:

  1. Implementeer de hulpfuncties CreateComponentCategory en RegisterCLSIDInCategory 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;      }
  2. Wijzig het besturingselement DllRegisterServer om het besturingselement te markeren als veilig. Zoek de implementatie van DllRegisterServer in een. cpp-bestand in uw project. U moet meerdere dingen toevoegen aan dit. cpp-bestand. Neem het bestand dat de CreateComponentCategory en RegisterCLSIDInCategory implementeert.

          #include "CatHelp.h"

    Definieer de GUID van de categorie├źn beveiligingsonderdeel.

          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 het besturingselement. Ter vereenvoudiging kunt u de GUID van de IMPLEMENT_OLECREATE_EX macro in het bestand main. cpp voor het besturingselement lenen. Pas de opmaak iets aan zodat deze er zo 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 het uitvoeren van scripts en initialisatie, moet u de functie DllRegisterServer als volgt wijzigen:

          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;      }

U hoeft de functie DllUnregisterServer niet normaal te wijzigen om de volgende twee redenen:

  • Het is niet mogelijk om een onderdeel categorie te verwijderen, omdat andere besturingselementen deze kunnen gebruiken.

  • Hoewel er een UnRegisterCLSIDInCategory-functie is gedefinieerd, verwijdert standaard DllUnregisterServer de vermelding van het besturingselement helemaal uit het register. Wanneer u de categorie van de registratie van het besturingselement verwijdert, is dit daarom niet te veel gebruikt.

Wanneer u een besturingselement hebt gecompileerd en geregistreerd, moet u de volgende vermeldingen vinden 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-component Development-veilige initialisatie en beveiliging van scripts voor ActiveX-besturingselementen

Meer hulp nodig?

Uw vaardigheden uitbreiden
Training verkennen
Als eerste nieuwe functies krijgen
Deelnemen aan Microsoft insiders

Was deze informatie nuttig?

Bedankt voor uw feedback.

Hartelijk dank voor uw feedback! Het lijkt ons een goed idee om u in contact te brengen met een van onze Office-ondersteuningsagenten.

×