이번에 Internet Explorer 7 환경에서 사용되는 프로그램 개발하였는데
굳이 폼까지 포함할 필요가 없어 ActiveX Library 로 개발하였습니다.
Activex Form 에 대한 예는 있는데 ActiveX Library에 대한 예는 없는 것같아
소스와 실제 구현예제를 올리니 필요하신 분 참고하세요..
/////////////////////////////////////////////////////////////////////
// ActiveX Library 생성
//
1. 파일 > New > ActiveX > ActiveX Library 생성
2. 파일 > New > ActiveX > Automation Object 추가
- CoClass Name 에 "AxLibTest"
- "Generate Event support Code" 체크
3. 프로젝트명 AxLibTest.dpr, 메인소스파일명 uAxLibTest.pas로 소스 저장
4. AxLibTest_TLB.pas 선택 후 F12 키 클릭으로 타입라이브러리 속성창 open
5. IAxLibTest 트리에서 마우스 오른쪽 버튼 클릭 > New > Method 클릭
- Method명을 showmsg 으로 변경
- Method "showmsg" 선택 후 오를쪽 Parameters 선택
- 파리미터명 "AMsg", 파라미터 타입 "BSTR" 추가
6. 타입라이브러리 속성 창 상단의 Refresh Implementation 클릭 > 속성 창 닫기
7. uAxLibTest.pas 선택 > uses 절에 Dialogs 추가
8. Showmessage 를 사용하기 위하여 uses 절에 Dialogs 유닛을 추가
9. "procedure TAxLibTest.showmsg(const AMsg: WideString);" 구문에
Dialogs.showmessage('웹으로부터 전달받은 값'#13 + AMsg); 을 입력 <--
///////////////////////////////////////////////////////////////////////
// ActiveX Library를 안전한 것으로 표시
//
10. 먼저 아래와 같이 다중상속을 받는 부분에 IPersistPropertyBag과
IObjectSafety를 추가
TAxLibTest = class(TAutoObject, IConnectionPointContainer, IAxLibTest, IPersistPropertyBag,
IObjectSafety)
11. BOOL 타입을 사용하기 위해 uses 절에 Windows 유닛 추가
12. TAxLibTest 클래스에 protected 로 아래와 같이 선언부 추가
{
******************************************************************************
* 안전한 것으로 표시된 ActiveX Control 선언 시작 *
******************************************************************************
}
protected
// 파라미터 넘어오는 것 테스트를 위한 변수 임의 선언..
msServerIP : string;
// IPersistPropertyBag 구현을 위한 추가부분..
// 태크를 통해 ActiveX 컨트롤로 정보전달을 위해서..
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;
// IObjectSafety 구현을 위한 추가부분..
// 안전하지 못하다는 보안메시지를 나오지 않게하기 위해서..
function ObjectSafetyGetInterfaceSafetyOptions(const IID: TIID;
pdwSupportedOptions, pdwEnabledOptions: PDWORD): HResult; stdcall;
function IObjectSafety.GetInterfaceSafetyOptions =
ObjectSafetyGetInterfaceSafetyOptions;
function ObjectSafetySetInterfaceSafetyOptions(const IID: TIID;
dwOptionSetMask, dwEnabledOptions: DWORD): HResult; stdcall;
function IObjectSafety.SetInterfaceSafetyOptions =
ObjectSafetySetInterfaceSafetyOptions;
{
******************************************************************************
* 안전한 것으로 표시된 ActiveX Control 선언 종료 *
******************************************************************************
}
13. 12항 에서 선언한 method 들을 구현부에 아래와 같이 구현
{
********************************************************************************
* 안전한 것으로 표시된 ActiveX Control 구현 시작 *
********************************************************************************
}
// IPersistPropertyBag의 method들의 구현부..
function TAxLibTest.PersistPropBagGetClassID(out classID: TCLSID) : HResult;
begin
Result := S_OK;
end;
function TAxLibTest.PersistPropBagInitNew : HResult;
begin
Result := S_OK;
end;
function TAxLibTest.PersistPropBagLoad(const pPropBag: IPropertyBag;
const pErrorLog:IErrorLog) : HResult;
var
v : OleVariant ;
begin
if pPropBag.Read('ServerIP',v,pErrorLog)=S_OK then
begin
msServerIP := v;
end;
Result := S_OK;
end;
function TAxLibTest.PersistPropBagSave(const pPropBag:IPropertyBag;
fClearDirty:BOOL; fAveAllProperties:BOOL) : HResult;
var
v : OleVariant ;
begin
v := msServerIP ;
pPropBag.Write('ServerIP',v) ;
Result := S_OK;
end;
// IObjectSafety의 method들의 구현부..
function TAxLibTest.ObjectSafetyGetInterfaceSafetyOptions(const IID: TIID;
pdwSupportedOptions, pdwEnabledOptions: PDWORD): HResult;
begin
Result := S_OK;
end;
function TAxLibTest.ObjectSafetySetInterfaceSafetyOptions(const IID: TIID;
dwOptionSetMask, dwEnabledOptions: DWORD): HResult;
begin
Result := S_OK;
end;
{
********************************************************************************
* 안전한 것으로 표시된 ActiveX Control 구현 종료 *
********************************************************************************
}
14. 컴파일 하면 bin 폴더에 AxLibTest.dll 가 생성 됨
//////////////////////////////////////////////////////////////////////////////////
// AxLibTest.dll에서 구현한 method를 호출학 위한 웹 페이지 작성
//
15. AxLibTest.htm 이름으로 bin 폴더에 웹 문서를 생성하고 아래와 같이 작성
- 참고. 아래 OBJECT 태그에 입력할 CLASSID는 AxLibTest_TLB.pas 의 CLASS_AxLibTest로 정의된 값임