Kaip naudoti "MFC ActiveX" valdiklius kaip saugius scenarijams ir inicijavimui

Suvestinė

Pagal numatytuosius nustatymą MFC "ActiveX" valdikliai nėra pažymėti kaip saugūs scenarijams ir saugu inicijuoti. Tai tampa akivaizdu, kai valdiklis paleidžiamas "Internet Explorer", kai nustatytas vidutinis arba aukštas saugos lygis. Bet kuriuo iš šių režimų galima matyti įspėjimus, kad valdiklio duomenys nėra patikimi arba kad valdiklis gali būti nesaugus naudoti scenarijams. Yra du būdai, kuriuos gali naudoti valdiklis šioms klaidoms pašalinti. Pirmasis apima valdiklį, įgyvendinantį IObjectSafety sąsają, ir yra naudingas valdikliams, kurie norėtų pakeisti savo elgesį ir tapti "saugiais", jei jie veikia interneto naršyklės kontekste. Antroji apima valdiklio DllRegisterServer funkciją, kad pažymėtumėte valdiklį "saugu" registre. Šis straipsnis apima antrąjį iš šių būdų. Pirmasis metodas, įgyvendinantis IObjectSafety sąsają, yra įtrauktas į interneto kliento SDK. Atminkite, kad valdiklis turi būti pažymėtas tik kaip saugus, jei jis yra saugus. Informacijos ieškokite interneto kliento SDK dokumentacijoje. Dalyje komponento kūrimas peržiūrėkite "ActiveX" valdiklių "saugus inicijavimas ir scenarijus".Pastaba Šiame straipsnyje neaprašomas būdas, kaip žymės langelį atsisiųsti. Daugiau informacijos apie kodo atsisiuntimą ir kodo pasirašymą rasite interneto kliento SDK.

Daugiau informacijos

Atlikite šiuos veiksmus, kad pažymėtumėte MFC "ActiveX" valdiklį kaip saugų scenarijams ir saugu inicijuoti:

  1. Įgyvendinkite "CreateComponentCategory" ir "RegisterCLSIDInCategory" pagalbininko funkcijas įtraukdami šiuos "cathelp. h" ir "cathelp. cpp" failus į jūsų projektą.

    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. Modifikuokite "DllRegisterServer", kad pažymėtumėte valdiklį kaip saugų. Raskite DllRegisterServer įdiegties. cpp faile savo projekte. Jums reikės įtraukti kelis dalykus į šį. cpp failą. Įtraukite failą, kuris įgyvendina "CreateComponentCategory" ir "RegisterCLSIDInCategory":

          #include "CatHelp.h"

    Apibrėžkite GUID, susietą su saugos komponentų kategorijomis:

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

    Apibrėžkite GUID, susietą su jūsų valdikliu. Kad būtų paprasčiau, galite skolintis GUID iš " IMPLEMENT_OLECREATE_EX " makrokomandos, esančios valdiklio pagrindiniame. cpp faile. Šiek tiek pakoreguokite formatą, kad jis atrodytų taip:

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

    Norėdami, kad jūsų valdiklis būtų pažymėtas kaip saugus scenarijams ir inicijavimui, modifikuokite funkciją DllRegisterServer taip:

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

Paprastai negalite modifikuoti DllUnregisterServer funkcijos dėl šių dviejų priežasčių:

  • Nenorėsite pašalinti komponento kategorijos, nes ją gali naudoti kiti valdikliai.

  • Nors yra nustatyta funkcija UnRegisterCLSIDInCategory, numatytoji DllUnregisterServer pašalina valdiklio įrašą iš registro visiškai. Todėl, pašalinus kategoriją iš valdiklio registracijos, yra mažai naudojama.

Surinkę ir Užregistravę savo valdiklį, į registrą turėtumėte ieškoti šių įrašų: 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}

Nuorodos

"Internet Client" SDK – komponentų kūrimas – saugus inicijavimas ir scenarijus "ActiveX" valdikliams

Reikia daugiau pagalbos?

Tobulinkite savo įgūdžius
Ieškoti mokymo
Pirmiausia gaukite naujų funkcijų
Prisijungti prie "Microsoft Insider"

Ar ši informacija buvo naudinga?

Dėkojame už jūsų atsiliepimus!

Dėkojame už jūsų atsiliepimą! Panašu, kad gali būti naudinga jus sujungti su vienu iš mūsų „Office“ palaikymo agentų.

×