Kā atzīmēt MFC ActiveX vadīklas kā drošu skriptošanu un inicializāciju

Kopsavilkums

Pēc noklusējuma MFC ActiveX vadīklas netiek atzīmētas kā drošas skriptošanai un drošas inicializēšanai. Tas kļūst redzams, ja vadīkla tiek palaista pārlūkprogrammā Internet Explorer ar drošības līmeni, kas iestatīts uz Vidējs vai augsts. Jebkurā no šiem režīmiem var tikt parādīti brīdinājumi par to, ka vadīklas dati nav droši vai ka vadīkla, iespējams, nav droša skriptu lietošanai. Pastāv divas metodes, ko vadīkla var izmantot, lai novērstu šīs kļūdas. Pirmais ir saistīts ar vadīklu, kas ievieš IObjectSafety interfeisu un ir noderīga vadīklām, kuras vēlas mainīt to darbību un kļūst par "drošu", ja tās tiek palaistas interneta pārlūkprogrammas kontekstā. Otrais ir saistīts ar vadīklas DllRegisterServer funkcijas mainīšanu, lai atzīmētu vadīklu "Safe" reģistrā. Šajā rakstā ir aprakstīta otrā no šīm metodēm. Pirmā metode, kas ievieš IObjectSafety interfeisu, ir iekļauta interneta klienta SDK. Lūdzu, ņemiet vērā, ka vadīkla ir jāatzīmē tikai kā droša, ja tā faktiski ir droša. Lai iegūtu šī apraksta aprakstu, lūdzu, skatiet interneta klienta SDK dokumentāciju. Sadaļā komponentu attīstība skatiet rakstu "drošas inicializācijas un skriptošanas ActiveX vadīklas".Piezīme. Šajā rakstā netiek apskatīts, kā marķēt vadīklu, lai to lejupielādētu. Papildinformāciju par koda lejupielādi un koda parakstīšanu skatiet interneta klienta SDK.

Papildinformācija

Veiciet šīs darbības, lai atzīmētu savu MFC ActiveX vadīklu kā drošu skriptošanai un drošu inicializēšanai:

  1. Ieviesiet CreateComponentCategory un RegisterCLSIDInCategory Helper funkcijas, pievienojot projektam šādus cathelp. h un cathelp. CPP failus.

    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. Modificējiet DllRegisterServer, lai atzīmētu vadīklu kā drošu. Savā projektā atrodiet DllRegisterServer implementēšanu. CPP failā. Failam šis. CPP ir jāpievieno vairākas lietas. Iekļaujiet failu, kas implementē CreateComponentCategory un RegisterCLSIDInCategory:

          #include "CatHelp.h"

    Definējiet GUID, kas saistīts ar drošības komponentu kategorijām:

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

    Definējiet ar vadīklu saistīto GUID. Vienkāršības labad GUID varat aizgūt no makro IMPLEMENT_OLECREATE_EX galvenā. CPP faila. Nedaudz pielāgojiet formatējumu, lai tas izskatītos šādi:

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

    Lai atzīmētu vadīklu kā drošu skriptošanai un inicializēšanai, modificējiet funkciju DllRegisterServer, veicot tālāk norādītās darbības.

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

Jūs parasti nemaināt funkciju DllUnregisterServer šiem diviem iemesliem:

  • Jūs nevēlaties noņemt komponentu kategoriju, jo citas vadīklas to var izmantot.

  • Lai gan ir definēta funkcija UnRegisterCLSIDInCategory, pēc noklusējuma DllUnregisterServer pilnībā izņem vadīklas ierakstu no reģistra. Tāpēc kategorijas noņemšana no vadīklas reģistrācijas ir neliela.

Pēc vadīklas kompilēšanas un reģistrēšanas ir jāatrod šādi reģistra ieraksti: 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}

Atsauces

Interneta klienta SDK — komponentu izstrāde — drošas inicializācijas un skriptošanas ActiveX vadīklām

Vai nepieciešama papildu palīdzība?

Paplašiniet savas prasmes
Iepazīties ar apmācību
Esiet pirmais, kas saņem jaunās iespējas
Pievienoties Microsoft Insider

Vai šī informācija bija noderīga?

Paldies par jūsu atsauksmēm!

Paldies par atsauksmēm! Šķiet, ka jums varētu būt noderīgi sazināties ar kādu no mūsu Office atbalsta speciālistiem.

×