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:

  1. Implementeer de CreateComponentCategory helperfuncties 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 de DllRegisterServer om het besturingselement als veilig te markeren. Zoek de implementatie van DllRegisterServer in een .cpp-bestand in uw project. U moet verschillende dingen toevoegen aan dit .cpp-bestand. Neem het bestand op dat wordt CreateComponentCategory geïmplementeerd en RegisterCLSIDInCategory:

    #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 standaard DllUnregisterServer 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