[기타지역] 델파이 ActiveX 컨트롤에서 ISafetyObject 인터페이스 구현
작성자 : 오수찬
작성일 : 2006-09-29
조회 : 624
출 처 : 미친병아리가 작성..
참 고 : MS ActiveX SDK Reference
Inside ATL/COM with Visual C++ Programming - 전병선 저
수정일 :
--------------------------------------------------------------------------------
참고 : 델4에서는 아래의 코드가 약간 변경되어야 합니다..
관련된 내용은 ActiveX 자료실에 올려둔 ActiveX 컨트롤의 보안처리
내용을 참고해주세요..
ActiveX 컨트롤은 자신이 불려질때 ActiveX 스크립팅을 사용하게 되는 경우가 있습
니다..
참고 : MS의 ActiveX 기술은 현재 크게 3가지로 구분되는데..
아래와 같습니다..
ActiveX 컨트롤
우리가 흔히 알고 있는 컨트롤을 칭하는 명칭입니다..
교육사업 및 게임존 용역, 퍼즐 등 저희가 만들었던
컨트롤들이 이에 속하고 이 컨트롤들은 OLE 서버가 되겠지요..
주로 인터넷 익스플로러라는 컨테이너에 의해 로딩되는..
이 외에도 ASP 서버 컴포넌트, MTS 컴포넌트, ATL로 만들어지는 각종 COM
등등 MS의 왠만한 것들은 모조리 ActiveX 컨트롤이라 불러도 됩니다..
물론 OLE 서버 뿐 아니라 컨테이너도 ActiveX 컨트롤로 불립니다..
ActiveX 문서
각종 ActiveX 컨트롤들과 연계되어 로딩될 수 있는 문서포멧을 칭합니다..
대표적인 예가 IE와 오피스가 설치되어 있다면 인터넷에서 IE를 이용해 오
피스로 작성된 모든 문서를 바로 볼 수 있습니다..
이 경우 오피스 프로그램이 OLE서버가 되고 IE가 컨테이너가 되어 오피스
문서를 로딩하게 되는데 이렇게 ActiveX 기술을 이용해 로딩될 수 있는
문서를 칭하는 명칭이며 좀 더 포괄적으로는 이에 관련된 기술들을
가리킵니다..
ActiveX 스크립팅
인터넷에서 스크립트 언어를 사용하기 위한 기술과 그 개체들을 가리키는
명칭입니다..
IE가 대표적인 ActiveX 스크립팅의 호스트 프로그램이고
MS의 VBScript와 JScript (Netscape의 자바 스크립트와 스펙은
비슷하지만 약간 다른점이 있죠..)가 대표적인 ActiveX 스크립팅
엔진의 예입니다.. 물론 MS에서 정의하고 있는 인터페이스를
따르도록 제작된 스크립트 엔진은 IE에 추가가 가능합니다..
결국, 인터넷에서 다양한 스크립트를 지원할 수 있도록 해주는
기술을 말하는 것이라 할 수 있습니다..
ActiveX 컨트롤이 ActiveX 스크립팅을 사용할때 컨테이너 (주로 IE가 되겠죠..)는
친절하게 사용자에게 위험성이 있다는 경고문을 보여주는 경우가 있습니다..
IE의 경우 보안등급을 보통으로 해놓는 경우 100% 경고메시지를 보여주고
있습니다.. 오브젝트 태그중 파라미터를 넘길 수 있는 경우가 있는데, 이 경우도
ActiveX 스크립팅을 사용하게 되는데 열심히 만들어논 컨트롤이 로딩시마다 이런 에
러메시지를 보인다면 실제 사이트에 적용시 문제가 아닐 수 없습니다..
MS에서는 이런 경우 컨트롤이 안전하다는 증빙을 위해 ISafetyObjec라는 인터페이스
를 정의해둬 컨트롤 내부에서 이 인터페이스를 구현하면 컨테이너 (IE)가 경고메시
지를 보여주지 않도록 준비해두고 있습니다..
MFC를 이용해 만든 AtiveX 컨트롤에서 구현하는 방법은 이미 조기봉씨가 이 게시판
에 올려두었고 저는 델파이에서 구현하는 방법을 올립니다..
근데 이게 아주 웃긴게.. 아무짓도 안하구 그냥 인터페이스만 우겨 넣으면 된다는거
죠.. 흘흘.. 아직까진 뭐하러 만들었나 의심가는 기능이고 개발자 귀찮게만 해놨는
데 더 두고 봐야겠죠..
일단 베이스 클래스의 다중상속 부분에 IObjectSafety를 추가합니다..
TExamShowX = class(TActiveForm, IExamShowX, IPersistPropertyBag,
IObjectSafety)
IPersistPropertyBag 인터페이스는 태그를 이용해 HTML 페이지로부터 값을
넘겨받기 위해 추가된 부분입니다..
뭐 같이 설명하죠..
결국 파라미터를 넘기다 보니 스크립트 안전성을 보장받아야 했던 경우니까요..
protected: 에 아래와 같은 내용을 추가합니다..
function IPersistPropertyBag.GetClassID =
PersistPropBagGetClassID ;
function IPersistPropertyBag.initNew =
PersistPropBagInitNew ;
function IPersistPropertyBag.Load = PersistPropBagLoad ;
function IPersistPropertyBag.Save = PersistPropBagSave ;
function PersistPropBagGetClassID(out classID : TCLSID)
: HResult ; stdcall ;
function PersistPropBagInitNew : HResult ; stdcall ;
function PersistPropBagLoad(const pPropBag:IPropertyBag ;
const pErrorLog:IErrorLog) : HResult ; stdcall ;
function PersistPropBagSave(const pPropBag:IPropertyBag ;
fClearDirty:BOOL ; fAveAllProperties:BOOL)
: HResult ; stdcall ;
function IObjectSafety.GetInterfaceSafetyOptions
= ObjectSafetyGetInterfaceSafetyOptions ;
function ObjectSafetyGetInterfaceSafetyOptions(riid:TIID ;
var dwSupportedOptions:DWORD ;
var dwEnabledOptions:DWORD) : HResult ; stdcall;
function IObjectSafety.SetInterfaceSafetyOptions
= ObjectSafetySetInterfaceSafetyOptions ;
function ObjectSafetySetInterfaceSafetyOptions(riid:TIID ;
dwOptionsSetMask:DWORD ;
dwEnabledOptions:DWORD) : HResult ; stdcall ;
그리고 실제 구현부는 아래와 같이 코딩을 해주시면 되지요..
function TExamShowX.PersistPropBagGetClassID
(out classID : TCLSID) : HResult ;
begin
Result := S_OK ;
end ;
function TExamShowX.PersistPropBagInitNew : HResult ;
begin
Result := S_OK ;
end ;
function TExamShowX.PersistPropBagLoad
(const pPropBag:IPropertyBag ;
const pErrorLog:IErrorLog) : HResult ;
var
v : OleVariant ;
begin
if pPropBag.Read(ServerIP,v,pErrorLog)=S_OK then
begin
m_sServerIP := v ;
Timer.Enabled := True ;
end ;
Result := S_OK ;
end ;
function TExamShowX.PersistPropBagSave
(const pPropBag:IPropertyBag ;
fClearDirty:BOOL ; fAveAllProperties:BOOL)
: HResult ; stdcall ;
var
v : OleVariant ;
begin
v := m_sServerIP ;
pPropBag.Write(ServerIP,v) ;
Result := S_OK ;
end ;
function TExamShowX.ObjectSafetyGetInterfaceSafetyOptions
(riid:TIID ; var dwSupportedOptions:DWORD ;
var dwEnabledOptions:DWORD) : HResult ; stdcall;
begin
Result := S_OK ;
end ;
function TExamShowX.ObjectSafetySetInterfaceSafetyOptions
(riid:TIID ; dwOptionsSetMask:DWORD ;
dwEnabledOptions:DWORD) : HResult ; stdcall;
begin
Result := S_OK ;
end ;
실제 파라미터 값을 받는 부분만 빼고는 S_OK를 넘기는게 전부입니다..
물론 실제 각 인터페이스들의 구현은 좀 더 복잡하지만.. 제가 테스트해본 결고로는
인터페이스와 메쏘드만 존재하고 S_OK 만 리턴되면 인터넷 익스플로러는 아주 행복
해 하더군요..
기람..