MFC ActiveX 컨트롤을 스크립팅 및 초기화에 안전한 것으로 표시
이 문서에서는 MFC ActiveX 컨트롤을 스크립팅 및 초기화에 안전한 것으로 표시하는 방법을 설명합니다.
원래 제품 버전: MFC ActiveX 컨트롤
원본 KB 번호: 161873
요약
기본적으로 MFC ActiveX 컨트롤은 스크립팅에 안전 및 초기화를 위한 안전으로 표시되지 않습니다. 이는 보안 수준이 중간 또는 높음으로 설정된 인터넷 Explorer 컨트롤이 실행될 때 명백해집니다. 이러한 모드 중 하나에서 컨트롤의 데이터가 안전하지 않거나 스크립트가 사용하기에 컨트롤이 안전하지 않을 수 있다는 경고가 표시될 수 있습니다.
컨트롤이 이러한 오류를 제거하는 데 사용할 수 있는 두 가지 방법이 있습니다. 첫 번째는 인터페이스를 구현하는 IObjectSafety
컨트롤을 포함하며, 인터넷 브라우저의 컨텍스트에서 실행되는 경우 동작을 변경하고 안전해지려는 컨트롤에 유용합니다. 두 번째는 레지스트리에서 컨트롤을 안전하게 표시하도록 컨트롤의 DllRegisterServer
함수를 수정하는 것입니다. 이 문서에서는 이러한 메서드의 두 번째 방법을 설명합니다. 인터페이스를 구현하는 IObjectSafety
첫 번째 메서드는 인터넷 클라이언트 SDK에서 다룹니다.
컨트롤은 실제로 안전한 경우에만 안전한 것으로 표시되어야 합니다. 이에 대한 설명은 인터넷 클라이언트 SDK 설명서를 참조하세요. 구성 요소 개발 섹션에서 ActiveX 컨트롤에 대한 안전한 초기화 및 스크립팅 을 참조하세요.
참고
이 문서에서는 컨트롤을 다운로드에 안전하게 표시하는 방법을 다루지 않습니다. 코드 다운로드 및 코드 서명에 대한 자세한 내용은 인터넷 클라이언트 SDK를 참조하세요.
추가 정보
다음 단계에 따라 MFC ActiveX 컨트롤을 스크립팅에 안전 및 초기화를 위한 안전으로 표시합니다.
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; }
컨트롤을
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 컨트롤에 대한 안전한 초기화 및 스크립팅
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기