Cum să marcați controalele ActiveX MFC ca sigure pentru scriptare și inițializare


Rezumat


În mod implicit, controalele ActiveX MFC nu sunt marcate ca sigure pentru scriptare și sigure pentru inițializare. Acest lucru devine evident atunci când controlul este rulat în Internet Explorer, cu nivelul de securitate setat la mediu sau maxim. În oricare dintre aceste moduri, se pot afișa avertismente că datele controlului nu sunt sigure sau că controlul este posibil să nu fie sigur pentru scripturi de utilizat. Există două metode pe care le poate utiliza un control pentru a elimina aceste erori. Primul implică controlul implementând interfața IObjectSafety și este util pentru controalele care ar dori să își modifice comportamentul și să devină "sigure" dacă rulează în contextul unui browser de internet. Cea de-a doua implică modificarea funcției DllRegisterServer a controlului pentru a marca controlul "sigur" în registry. Acest articol se referă la a doua dintre aceste metode. Prima metodă, implementarea interfeței IObjectSafety, este acoperită în SDK-ul client Internet. Vă rugăm să rețineți că un control ar trebui să fie marcat doar ca sigur dacă este, de fapt, sigur. Vă rugăm să consultați documentația SDK pentru clientul de Internet pentru o descriere a acestuia. Consultați "inițializare sigură și scriptare pentru controalele ActiveX" sub secțiunea dezvoltare componente.Notă Acest articol nu acoperă modul în care să marcați un control sigur pentru a-l descărca. Pentru mai multe informații despre descărcarea codului și semnarea codului, consultați SDK-ul pentru clientul de internet.

Mai multe informații


Urmați acești pași pentru a marca controlul ActiveX MFC ca sigur pentru scripturi și pentru inițializare în siguranță:
  1. Implementați funcțiile Helper CreateComponentCategory și RegisterCLSIDInCategory prin adăugarea următoarelor fișiere cathelp. h și cathelp. cpp la proiect.

    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. Modificați DllRegisterServer pentru a marca controlul ca fiind sigur. Găsiți implementarea DllRegisterServer într-un fișier. cpp din Project. Va trebui să adăugați mai multe lucruri la acest fișier. CPP. Includeți fișierul care implementează CreateComponentCategory și RegisterCLSIDInCategory:
          #include "CatHelp.h"
    Definiți GUID-ul asociat categoriilor de componente de siguranță:
          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}};
    Definiți GUID-ul asociat cu controlul dvs. Pentru simplitate, puteți împrumuta GUID-ul de la macrocomanda IMPLEMENT_OLECREATE_EX în fișierul principal. CPP pentru control. Ajustați ușor formatul, astfel încât să arate astfel:
          const GUID CDECL BASED_CODE _ctlid =      { 0x43bd9e45, 0x328f, 0x11d0,              { 0xa6, 0xb9, 0x0, 0xaa, 0x0, 0xa7, 0xf, 0xc2 } };
    Pentru a marca controlul ca fiind sigur pentru scripturi și inițializare, modificați funcția DllRegisterServer după cum urmează:
          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;      }
În mod normal, nu modificați funcția DllUnregisterServer din aceste două motive:
  • Nu doriți să eliminați o categorie de componente, deoarece alte controale o pot utiliza.
  • Deși există o funcție UnRegisterCLSIDInCategory definită, în mod implicit DllUnregisterServer elimină intrarea controlului din registry în întregime. Prin urmare, eliminarea categoriei din înregistrarea controlului este de mică utilizare.
După compilarea și înregistrarea controlului, ar trebui să găsiți următoarele intrări în registry:
   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} 

Referințe


SDK client Internet-dezvoltare componente-inițializare sigură și scriptare pentru controalele ActiveX