MFC ActiveX denetimlerini Betik Oluşturma ve Başlatma için Güvenli olarak işaretleme

Bu makalede, MFC ActiveX denetimlerinin Betik Oluşturma ve Başlatma için Güvenli olarak işaretlenmesi açıklanmaktadır.

Orijinal ürün sürümü: MFC ActiveX denetimleri
Özgün KB numarası: 161873

Özet

Varsayılan olarak, MFC ActiveX denetimleri Betik Oluşturma için Güvenli ve Başlatma için Güvenli olarak işaretlenmez. Denetim Internet Explorer'da çalıştırıldığında güvenlik düzeyi orta veya yüksek olarak ayarlandığında bu durum ortaya çıkıyor. Bu modlardan birinde, denetimin verilerinin güvenli olmadığı veya denetimin betiklerin kullanımı için güvenli olmayabileceğine ilişkin uyarılar görüntülenebilir.

Bir denetimin bu hataları ortadan kaldırmak için kullanabileceği iki yöntem vardır. İlki, arabirimi uygulayan IObjectSafety denetimi içerir ve davranışlarını değiştirmek ve bir Internet Browser bağlamında çalıştırılırsa güvenli hale gelmek isteyen denetimler için yararlıdır. İkincisi, denetimin işlevini kayıt defterinde denetimin DllRegisterServer kasasını işaretlemek için değiştirmeyi içerir. Bu makale, bu yöntemlerin ikincisini kapsar. Arabirimi uygulayan IObjectSafety ilk yöntem, İnternet İstemci SDK'sında ele alınmıştır.

Bir denetimin yalnızca aslında güvenliyse güvenli olarak işaretlenmesi gerektiğini unutmayın. Bunun açıklaması için İnternet İstemci SDK'sı belgelerine bakın. Bileşen Geliştirme Bölümü altındaki ActiveX Denetimleri için Güvenli Başlatma ve Betik Oluşturma bölümüne bakın.

Not

Bu makalede, bir denetimin indirilmesi için güvenli olarak işaretlenmesi ele alınmaz. Kod indirme ve kod imzalama hakkında daha fazla bilgi için lütfen İnternet İstemciSI SDK'sına bakın.

Daha fazla bilgi

MFC ActiveX Denetiminizi Betik Oluşturma için Güvenli ve Başlatma için Güvenli olarak işaretlemek için şu adımları izleyin:

  1. CreateComponentCategory Projenize aşağıdaki cathelp.h ve cathelp.cpp dosyalarını ekleyerek ve RegisterCLSIDInCategory yardımcı işlevlerini uygulayın.

    • 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. denetimi güvenli olarak işaretlemek için öğesini DllRegisterServer değiştirin. DllRegisterServer uygulamasını projenizdeki bir .cpp dosyasında bulun. Bu .cpp dosyasına birkaç şey eklemeniz gerekir. ve RegisterCLSIDInCategoryuygulayan CreateComponentCategory dosyayı ekleyin:

    #include "CatHelp.h"
    

    Güvenlik bileşeni kategorileri ile ilişkili GUID'yi tanımlayın:

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

    Denetiminizle ilişkili GUID'yi tanımlayın. Kolaylık olması için, denetimin ana .cpp dosyasındaki makrodan IMPLEMENT_OLECREATE_EX GUID'yi ödünç alabilirsiniz. Biçimi aşağıdaki gibi görünecek şekilde biraz ayarlayın:

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

    Denetiminizi betik oluşturma ve başlatma için güvenli olarak işaretlemek için işlevi aşağıdaki gibi değiştirin 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;
    }
    

    Normalde işlevi şu iki nedenle değiştirmezsiniz DllUnregisterServer :

    • Diğer denetimler bunu kullanıyor olabileceği için bileşen kategorisini kaldırmak istemezsiniz.

    • Tanımlanmış bir UnRegisterCLSIDInCategory işlev olsa da, varsayılan olarak DllUnregisterServer denetimin girdisini kayıt defterinden tamamen kaldırır. Bu nedenle, kategoriyi denetimin kaydından kaldırmak çok az kullanılır.

    Denetiminizi derleyip kaydettikten sonra kayıt defterinde aşağıdaki girdileri bulmanız gerekir:

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

Başvurular

Internet İstemci SDK'sı - Bileşen Geliştirme - ActiveX Denetimleri için Güvenli Başlatma ve Betik Oluşturma