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:
Implementare le
CreateComponentCategory
funzioni helper eRegisterCLSIDInCategory
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; }
Modificare per
DllRegisterServer
contrassegnare il controllo come sicuro. Individuare l'implementazione diDllRegisterServer
in un file di .cpp nel progetto. Sarà necessario aggiungere diversi elementi a questo file di .cpp. Includere il file che implementaCreateComponentCategory
eRegisterCLSIDInCategory
:#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 predefinitaDllUnregisterServer
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
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per