วิธีการทำเครื่องหมายตัวควบคุม MFC ActiveX ที่ปลอดภัยสำหรับการเขียนสคริปต์และการเตรียมใช้งาน


สรุป


ตามค่าเริ่มต้นตัวควบคุม MFC ActiveX จะไม่ถูกทำเครื่องหมายว่าปลอดภัยสำหรับการเขียนสคริปต์และความปลอดภัยสำหรับการเตรียมใช้งาน การดำเนินการนี้จะแสดงให้เห็นชัดเจนเมื่อมีการเรียกใช้ตัวควบคุมใน Internet Explorer ที่มีการตั้งค่าระดับความปลอดภัยเป็นปานกลางหรือสูง ในโหมดใดโหมดหนึ่งเหล่านี้คำเตือนอาจแสดงว่าข้อมูลของตัวควบคุมไม่ปลอดภัยหรือตัวควบคุมอาจไม่ปลอดภัยสำหรับการใช้สคริปต์ มีสองวิธีที่ตัวควบคุมสามารถใช้เพื่อกำจัดข้อผิดพลาดเหล่านี้ได้ ครั้งแรกที่เกี่ยวข้องกับตัวควบคุมที่ใช้ส่วนติดต่อ IObjectSafety และมีประโยชน์สำหรับตัวควบคุมที่ต้องการเปลี่ยนลักษณะการทำงานของพวกเขาและกลายเป็น "ปลอดภัย" ถ้ามีการเรียกใช้ในบริบทของเบราว์เซอร์อินเทอร์เน็ต ที่สองจะเกี่ยวข้องกับการปรับเปลี่ยนฟังก์ชัน DllRegisterServer ของตัวควบคุมเพื่อทำเครื่องหมายตัวควบคุม "ปลอดภัย" ในรีจิสทรี บทความนี้ครอบคลุมวิธีการเหล่านี้ที่สอง วิธีการแรกที่ใช้ส่วนติดต่อ IObjectSafety จะได้รับการปกคลุมใน SDK ไคลเอ็นต์อินเทอร์เน็ต โปรดจำไว้ว่าตัวควบคุมควรถูกทำเครื่องหมายว่าปลอดภัยหรือไม่ถ้ามีอยู่ในความเป็นจริงความปลอดภัย โปรดดูเอกสารประกอบของอินเทอร์เน็ตไคลเอ็นต์ SDK สำหรับคำอธิบายนี้ ให้ดูที่ "การเตรียมใช้งานและการเขียนสคริปต์ที่ปลอดภัยสำหรับตัวควบคุม ActiveX" ภายใต้ส่วนการพัฒนาคอมโพเนนต์หมายเหตุ บทความนี้ไม่ได้ครอบคลุมวิธีการทำเครื่องหมายตัวควบคุมที่ปลอดภัยสำหรับการดาวน์โหลด สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการดาวน์โหลดโค้ดและการเซ็นชื่อโค้ดโปรดดูที่ SDK ไคลเอ็นต์อินเทอร์เน็ต

ข้อมูลเพิ่มเติม


ทำตามขั้นตอนต่อไปนี้เพื่อทำเครื่องหมายตัวควบคุม MFC ActiveX ที่ปลอดภัยสำหรับการเริ่มต้นใช้งานสคริปต์:
  1. ใช้ฟังก์ชัน CreateComponentCategory และ RegisterCLSIDInCategory ด้วยการเพิ่มไฟล์ cathelp และ cathelp ต่อไปนี้ไปยังโครงการของคุณ

    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. ปรับเปลี่ยน DllRegisterServer เพื่อทำเครื่องหมายตัวควบคุมให้ปลอดภัย ค้นหาการดำเนินการของ DllRegisterServer ในไฟล์ cpp ในโครงการของคุณ คุณจะต้องเพิ่มหลายสิ่งไปยังไฟล์ cpp นี้ รวมไฟล์ที่ใช้ CreateComponentCategory และ RegisterCLSIDInCategory:
          #include "CatHelp.h"
    กำหนด GUID ที่เกี่ยวข้องกับประเภทของคอมโพเนนต์ความปลอดภัย:
          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}};
    กำหนด GUID ที่เกี่ยวข้องกับตัวควบคุมของคุณ สำหรับความเรียบง่ายคุณสามารถยืม GUID จากแมโคร IMPLEMENT_OLECREATE_EX ในไฟล์ cpp หลักสำหรับตัวควบคุม ปรับรูปแบบเล็กน้อยเพื่อให้มีลักษณะดังต่อไปนี้:
          const GUID CDECL BASED_CODE _ctlid =      { 0x43bd9e45, 0x328f, 0x11d0,              { 0xa6, 0xb9, 0x0, 0xaa, 0x0, 0xa7, 0xf, 0xc2 } };
    เมื่อต้องการทำเครื่องหมายตัวควบคุมของคุณให้ปลอดภัยสำหรับการเขียนสคริปต์และการเตรียมใช้งานให้ปรับเปลี่ยนฟังก์ชัน DllRegisterServer ดังต่อไปนี้
          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;      }
โดยปกติแล้วคุณจะไม่สามารถปรับเปลี่ยนฟังก์ชัน DllUnregisterServer ได้ด้วยเหตุผลสองประการดังนี้
  • คุณไม่ต้องการเอาประเภทคอมโพเนนต์ออกเนื่องจากตัวควบคุมอื่นๆอาจใช้งานได้
  • แม้ว่าจะมีฟังก์ชัน UnRegisterCLSIDInCategory ถูกกำหนดโดยค่าเริ่มต้น DllUnregisterServer จะเอารายการของตัวควบคุมออกจากรีจิสทรีทั้งหมด ดังนั้นการเอาประเภทออกจากการลงทะเบียนของตัวควบคุมจะใช้งานน้อย
หลังจากการคอมไพล์และการลงทะเบียนตัวควบคุมของคุณคุณควรค้นหารายการต่อไปนี้ในรีจิสทรี:
   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} 

อ้างอิง


SDK ไคลเอ็นต์อินเทอร์เน็ต-การพัฒนาคอมโพเนนต์-การเตรียมใช้งานที่ปลอดภัยและการเขียนสคริปต์สำหรับตัวควบคุม ActiveX