MFC ActiveX 컨트롤을 스크립팅 및 초기화에 안전한 것으로 표시

이 문서에서는 MFC ActiveX 컨트롤을 스크립팅 및 초기화에 안전한 것으로 표시하는 방법을 설명합니다.

원래 제품 버전: MFC ActiveX 컨트롤
원본 KB 번호: 161873

요약

기본적으로 MFC ActiveX 컨트롤은 스크립팅에 안전 및 초기화를 위한 안전으로 표시되지 않습니다. 이는 보안 수준이 중간 또는 높음으로 설정된 인터넷 Explorer 컨트롤이 실행될 때 명백해집니다. 이러한 모드 중 하나에서 컨트롤의 데이터가 안전하지 않거나 스크립트가 사용하기에 컨트롤이 안전하지 않을 수 있다는 경고가 표시될 수 있습니다.

컨트롤이 이러한 오류를 제거하는 데 사용할 수 있는 두 가지 방법이 있습니다. 첫 번째는 인터페이스를 구현하는 IObjectSafety 컨트롤을 포함하며, 인터넷 브라우저의 컨텍스트에서 실행되는 경우 동작을 변경하고 안전해지려는 컨트롤에 유용합니다. 두 번째는 레지스트리에서 컨트롤을 안전하게 표시하도록 컨트롤의 DllRegisterServer 함수를 수정하는 것입니다. 이 문서에서는 이러한 메서드의 두 번째 방법을 설명합니다. 인터페이스를 구현하는 IObjectSafety 첫 번째 메서드는 인터넷 클라이언트 SDK에서 다룹니다.

컨트롤은 실제로 안전한 경우에만 안전한 것으로 표시되어야 합니다. 이에 대한 설명은 인터넷 클라이언트 SDK 설명서를 참조하세요. 구성 요소 개발 섹션에서 ActiveX 컨트롤에 대한 안전한 초기화 및 스크립팅 을 참조하세요.

참고

이 문서에서는 컨트롤을 다운로드에 안전하게 표시하는 방법을 다루지 않습니다. 코드 다운로드 및 코드 서명에 대한 자세한 내용은 인터넷 클라이언트 SDK를 참조하세요.

추가 정보

다음 단계에 따라 MFC ActiveX 컨트롤을 스크립팅에 안전 및 초기화를 위한 안전으로 표시합니다.

  1. CreateComponentCategory 다음 cathelp.h 및 cathelp.cpp 파일을 프로젝트에 추가하여 및 RegisterCLSIDInCategory 도우미 함수를 구현합니다.

    • 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 안전한 것으로 표시하도록 을 수정합니다. 프로젝트의 .cpp 파일에서 구현 DllRegisterServer 을 찾습니다. 이 .cpp 파일에 몇 가지를 추가해야 합니다. 및 RegisterCLSIDInCategory를 구현하는 파일을 포함합니다.CreateComponentCategory

    #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를 정의합니다. 간단히 하기 위해 컨트롤에 대한 기본 .cpp 파일의 IMPLEMENT_OLECREATE_EX 매크로에서 GUID를 빌릴 수 있습니다. 형식을 다음과 같이 약간 조정합니다.

    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}

참조

Internet Client SDK - 구성 요소 개발 - ActiveX 컨트롤에 대한 안전한 초기화 및 스크립팅