ATL ActiveX 에서 실행시 보안 팝업창 없애는 법

이 글은 브라우저 상단에 뜨는 ActiveX 경고창이 아닌 ActiveX 스크립트 실행중에 별도로 뜨는 ActiveX 스크립트 경고 팝업창을 없애는 방법을 말한다.(아래그림)

컨트롤이 스크립팅에 대해 안전함을 표시

Internet Explorer에서 컨트롤이 있는 웹 페이지를 볼 수 있으며 보다 편리하게 Visual C++ .NET에 빌드된 웹 브라우저 뷰를 사용할 수 있습니다. 웹 브라우저 뷰에서 컨트롤을 보려면 마우스 오른쪽 단추로 PolyCtl.htm을 클릭하고 브라우저에서 보기를 클릭합니다.

현재의 Internet Explorer 보안 설정에 따라 컨트롤이 스크립트에 대해 안전하지 않고 잠재적으로 손상을 입힐 수도 있다고 표시된 보안 경고 대화 상자가 나타납니다. 예를 들어 파일을 표시하는 기능이 있고 파일을 삭제하는 삭제 메서드도 포함된 컨트롤은 페이지에서 표시되기만 할 때는 안전합니다. 그러나 이 컨트롤은 일부 사용자가 삭제 메서드를 호출할 수 있기 때문에 스크립트를 사용하는 경우에는 안전하지 않습니다.

이 특정 컨트롤에 대해서는 보안 경고 대화 상자를 표시할 필요가 없다고 Internet Explorer에 프로그래밍 방식으로 알릴 수 있습니다. 이 작업은 IObjectSafety 인터페이스를 사용하여 수행할 수 있으며 ATL에서는 IObjectSafetyImpl 클래스를 통해 이 인터페이스의 구현을 제공합니다. 이 인터페이스를 사용자 컨트롤에 추가하려면 IObjectSafetyImpl을 상속된 클래스 목록에 추가한 후 COM 맵에 이에 대한 엔트리를 추가하면 됩니다.

컨트롤에 IObjectSafetyImpl을 추가하려면…

  • 다음 줄을 PolyCtl.h에서 상속된 클래스 목록의 끝에 추가하고 그 이전 줄에 쉼표를 넣습니다.
    public IObjectSafetyImpl<CPolyCtl, INTERFACESAFE_FOR_UNTRUSTED_CALLER>
  • 다음 줄을 PolyCtl.h의 COM 맵에 추가합니다.
    COM_INTERFACE_ENTRY(IObjectSafety)

위의 방법은 컨트롤이 호출되는 런타임 시점에서 안정성을 확보하는 것이며 두번째 방법으로 다음은 레지스트리에 컨트롤을 등록하는 시점에서 안정성 보장을 추가하는 방법이다.

아래 파일을 다운로드 받아 (helpers.h,helpers.cpp) 자신의 ~Ctrl.cpp 에 #include 하면 된다.
helpers.zip

 

아래처럼 두개의 CATID를 선언한다.

#include "helpers.h" //안정성 보장관련 추가 (컨트롤 등록시)
//#include "objsafe.h" //안정성 보장관련 추가(런타임시)

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

REFCLSID clsidCurrentActiveX = CLSID_BaroUpPTCtrl;//BaroUpPT_i.c 에서 가져옴

 

아래처럼 레지스트리 등록함수에 굵은부분의 코드를 추가한다.

// DllRegisterServer - 시스템 레지스트리에 항목을 추가합니다.
STDAPI DllRegisterServer(void)
{ 
 HRESULT hr = _AtlModule.DllRegisterServer();
 // 추가시작 부분 >>>>>>
 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(clsidCurrentActiveX, CATID_SafeForScripting) ))
 return ResultFromScode(SELFREG_E_CLASS);
 
 if (FAILED( RegisterCLSIDInCategory(clsidCurrentActiveX, CATID_SafeForInitializing) ))
 return ResultFromScode(SELFREG_E_CLASS);
 //추가 끝 부분 <<<<<<< 
 return hr;
}

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다