HOWTO: MFC 컨트롤을 스크립트 사용에 안전(Safe for Scripting)/초기화에 안전(Safe for Initialization)으로 표시

기술 자료 번역 기술 자료 번역
기술 자료: 161873 - 이 문서가 적용되는 제품 보기.
이 문서는 이전에 다음 ID로 출판되었음: KR161873
모두 확대 | 모두 축소

요약

기본적으로 MFC ActiveX 컨트롤은 스크립트 사용에 안전(Safe for Scripting) 또는 초기화에 안전(Safe for Initialization)으로 표시되지 않습니다. 이것은 보안 수준이 보통으로 또는 높게 설정된 Internet Explorer에서 컨트롤을 실행할 때 나타납니다. 이 두 모드 중 하나에서 컨트롤의 데이터가 안전하지 않거나 컨트롤이 스크립트를 사용하기에 안전하지 않을 수도 있다는 내용의 경고가 표시될 수 있습니다.

이 오류를 없애기 위해 컨트롤에서 사용할 수 있는 두 가지 방법이 있습니다. 첫 번째 방법은 IObjectSafety 인터페이스를 구현하는 컨트롤과 관계가 있으며 인터넷 브라우저 컨텍스트에서 실행하는 경우 자신의 동작을 변경하여 "안전한" 상태가 되는 컨트롤에 유용합니다. 두 번째 방법에서는 컨트롤의 DllRegisterServer 함수를 수정하여 레지스트리에 컨트롤을 "안전한" 것으로 표시합니다. 본 문서에서는 이 중 두 번째 방법을 설명합니다. IObjectSafety 인터페이스를 구현하는 첫 번째 방법은 인터넷 클라이언트 SDK에서 설명합니다.

실제로 안전한 컨트롤에 대해서만 안전하다는 표시를 해야 합니다. 이에 대한 설명은 인터넷 클라이언트 SDK를 참조하십시오. Component Development 절에서 "Safe Initialization and Scripting for ActiveX Controls"를 참조하십시오.

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

추가 정보

MFC ActiveX 컨트롤을 "스크립트 사용에 안전" 및 "초기화에 안전"으로 표시하려면 아래 단계를 수행합니다.

  1. 프로젝트에 아래와 같은 cathelp.h 및 cathelp.cpp 파일을 추가하여 CreateComponentCategory 및 RegisterCLSIDInCategory 헬퍼(Helper) 함수를 구현합니다.

    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 파일에 몇 가지를 추가해야 합니다. 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를 정의합니다. 편의를 위해, 컨트롤을 위한 주 .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\{"컨트롤의 GUID"}\Implemented
   Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}

   HKEY_CLASSES_ROOT\CLSID\{"컨트롤의 GUID"}\Implemented
   Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}

참조

인터넷 클라이언트 SDK - Component Development - Safe Initialization and Scripting for ActiveX Controls

속성

기술 자료: 161873 - 마지막 검토: 2004년 9월 21일 화요일 - 수정: 3.0
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Visual C++ 4.2 Professional Edition
  • Microsoft Visual C++ 5.0 Standard Edition
  • Microsoft Visual C++ 6.0 서비스 팩 5
  • Microsoft Internet Explorer(프로그래밍)
키워드:?
kbactivex kbcomt kbctrl kbdsi kbfasttip kbgrpmfcatl kbinprocsvr kbinternet kbmfc kbole kbhowto KB161873
더 이상 지원되지 않는 제품의 KB 내용에 대한 고지 사항
이 문서에서는 Microsoft에서 더 이상 지원하지 않는 제품에 대해 설명합니다. 따라서 이 문서는 "있는 그대로" 제공되며 업데이트되지 않습니다.

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com