Contrassegnare i controlli ActiveX MFC come sicuri per lo scripting e l'inizializzazione

Questo articolo descrive come contrassegnare i controlli ActiveX MFC come sicuri per l'inizializzazione e lo scripting.

Versione originale del prodotto: Controlli ActiveX MFC
Numero KB originale: 161873

Riepilogo

Per impostazione predefinita, i controlli ActiveX MFC non sono contrassegnati come sicuri per lo scripting e sicuri per l'inizializzazione. Ciò diventa evidente quando il controllo viene eseguito in Internet Explorer con il livello di sicurezza impostato su medio o alto. In una di queste modalità, è possibile che vengano visualizzati avvisi che segnalano che i dati del controllo non sono sicuri o che il controllo potrebbe non essere sicuro per l'uso degli script.

Esistono due metodi che un controllo può usare per eliminare questi errori. Il primo include il controllo che implementa l'interfaccia IObjectSafety ed è utile per i controlli che vogliono modificarne il comportamento e diventare sicuri se eseguiti nel contesto di un Browser Internet. Il secondo comporta la modifica della funzione del DllRegisterServer controllo per contrassegnare il controllo sicuro nel Registro di sistema. Questo articolo illustra il secondo di questi metodi. Il primo metodo, che implementa l'interfaccia IObjectSafety , è illustrato in Internet Client SDK.

Tenere presente che un controllo deve essere contrassegnato come sicuro solo se è, di fatto, sicuro. Per una descrizione, vedere la documentazione di Internet Client SDK. Vedere Inizializzazione sicura e scripting per i controlli ActiveX nella sezione Sviluppo di componenti.

Nota

Questo articolo non illustra come contrassegnare un controllo sicuro per il download. Per altre informazioni sul download del codice e sulla firma del codice, vedere Internet Client SDK.

Ulteriori informazioni

Seguire questa procedura per contrassegnare il controllo ActiveX MFC come sicuro per gli script e sicuro per l'inizializzazione:

  1. Implementare le CreateComponentCategory funzioni helper e RegisterCLSIDInCategory aggiungendo i file cathelp.h e cathelp.cpp seguenti al progetto.

    • 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. Modificare per DllRegisterServer contrassegnare il controllo come sicuro. Individuare l'implementazione di DllRegisterServer in un file di .cpp nel progetto. Sarà necessario aggiungere diversi elementi a questo file di .cpp. Includere il file che implementa CreateComponentCategory e RegisterCLSIDInCategory:

    #include "CatHelp.h"
    

    Definire il GUID associato alle categorie di componenti di sicurezza:

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

    Definire il GUID associato al controllo. Per semplicità, è possibile prendere in prestito il GUID dalla IMPLEMENT_OLECREATE_EX macro nel file di .cpp principale per il controllo. Modificare leggermente il formato in modo che sia simile al seguente:

    const GUID CDECL BASED_CODE _ctlid =
    { 0x43bd9e45, 0x328f, 0x11d0,
    { 0xa6, 0xb9, 0x0, 0xaa, 0x0, 0xa7, 0xf, 0xc2 } };
    

    Per contrassegnare il controllo come sicuro per lo scripting e l'inizializzazione, modificare la DllRegisterServer funzione nel modo seguente:

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

    In genere non si modifica la DllUnregisterServer funzione per questi due motivi:

    • Non si vuole rimuovere una categoria di componenti perché altri controlli potrebbero usarla.

    • Anche se esiste una UnRegisterCLSIDInCategory funzione definita, per impostazione predefinita DllUnregisterServer rimuove completamente la voce del controllo dal Registro di sistema. Pertanto, la rimozione della categoria dalla registrazione del controllo è di scarsa utilità.

    Dopo aver compilato e registrato il controllo, è necessario trovare le voci seguenti nel Registro di sistema:

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

Riferimenti

Internet Client SDK - Sviluppo di componenti - Inizializzazione e scripting sicuri per i controlli ActiveX