몇일간 여기 저기 돌아 다니면서 찾아 도 보고 했는데
잘 모르겠네요. 여기서도 검색해서 내용을 읽어 봤지만
자세히 나오지를 않아서요.
ATL COM 으로 만든 건데요.
기존에 글들 대부분이 MFC 로 만든 ActiveX 에 param 으로
초기화 하는 설명이 대부분이고 ATL COM 할려면 어떤 부분
에서 처리를 해야 하는지에 대한건 별로 없더라고요.
(있긴 한데 간략하게 써 있어서 알수가 없었어요)

간략하게 html 문서 상에서 param 을 이용해서 문자를 저장하는
소스나 하는법좀 가르켜 주셨으면 합니다.

즐거운 하루 되세요.

혹시 해보신분 계시면 꼭좀 부탁합니다 ㅜ,.ㅜ

....
mildblue7 (등록일 : 2002-04-16 10:36)
* ATL Property Bag 사용하기

html에서

<OBJECT>
<PARAM name="USerCode" value="10">
</OBJECT>

이런 식으로 초기화 값을 넘기고 싶을 때가 있다.

Composition control 로 만들어진 ActiveX를 기준으로 하였다.
Simple Object로 만든 ActiveX라면 별도의 인터페이스를 상속받아야 한다.
ATL 에서 제공하는 IPersistPropertyBagImpl 클래스는 멤버 변수 m_bRequiresSave 를 사
용하는데, 이 변수는 <atlctl.h> 헤더 파일의 CComControlBase 클래스에 정의되어 있
다.
CComControlBase를 그대로 쓸 수 없으니, 이에서 파생된 가장 간단한 템플릿 클래스인
CComControl<> 클래스를 상속받으면 된다.
CompositeControl 은 위저드에 의해서 CComCompositeControl에서 파생되는데,

class CComCompositeControl : public CComControl< T, CAxDialogImpl< T > >

이기 때문에 별도로 CComControl<>을 상속받을 필요가 없다.

여기서는 CEchatRecorder 라는 클래스를 사용한다.

0. CComControl<>에서 파생되지 않았다면 클래스 상속 목록에 CComControl<> 을 추가한
다.

class ATL_NO_VTABLE CEchatRecorder :
..... ( 중간 생략 ) ......
public CComControl<CEchatRecorder>

이런 식으로 한다.

1. PersistPropertyBagImpl 을 상속받는다.

AcitveX 클래스의 상속 리스트에 다음을 추가한다.

class ATL_NO_VTABLE CEchatRecorder :
..... ( 중간 생략 ) ......
public IPersistPropertyBagImpl<CEchatRecorder>

2. COM 맵에 PersistPropertyBag의 엔트리 포인트를 추가한다.

BEGIN_COM_MAP(CEchatRecorder)
COM_INTERFACE_ENTRY(IPersistPropertyBag)
END_COM_MAP()

3. 초기값으로 설정할 변수를 다룰 프로퍼티를 추가한다.
중요한 것은 반드시!!! put/get 동시에 추가해야 한다는 점이다.
SerUser 라는 프로퍼티를 주가해 보자.

그러면 idl 파일에,

[propget, id(1), helpstring("property UserCode")] HRESULT UserCode([out,
retval] long *pVal);
[propput, id(1), helpstring("property UserCode")] HRESULT UserCode([in]
long newVal);

이런 식으로 추가가 될 것이다. 여기서 id 값은 이전에 메서드니 프로퍼티를 추가했었다

1이 아닌 값이 할당될테지만, 어느 경우에서나 put/get은 동일한 id를 갖는다.

4. PROP_MAP에 프로퍼티 엔트리 포인터를 추가해 준다.

BEGIN_PROP_MAP(CEchatRecorder)
PROP_ENTRY("UserCode", 1, CLSID_EchatRecorder )
END_PROP_MAP()

note.
<PARAM> 으로 넘긴 값은 AcviteX의 OnInitDialog()가 호출되기 전에 세팅된다. <PARAM>
으로 넘길 프로퍼티의 초기값을 설정해야 한다면 OnInitDialog() 안이 아니라 생성자에
서 초기값을 설정하라.
그렇지 않으면 <PARAM>에서 넘어간 값이 OnInitDialog()에서 덮어씌워진다.

+ Recent posts