액티브 X 컴포넌트에 param 태그 쓰기
액티브 X 컴포넌트에 param 태그를 통해, html 수준에서 값을 넘기는 작업을 하는 코드들을 적어봤다. mfc 는 쉽게 되지만, atl 의 경우는 잘 안되더라(이글쓰는 지금도..)
MFC active X 에서 param 태그 쓰기
위저드에서 MFC ActiveX ControlWizard 를 골랐을때이다. 우선 URL 이란 프라퍼티를 추가한다. 이때 add property 후의 다이얼로그에서, URL 의 타입을 CString 으로 해줘야 한다.(이걸 BSTR 로 했다가 삽질 무지 했음) 대강 Get, Set 함수를 만들어 준후, 다음 함수를 수정한다.
void CMfcAxCtrl::DoPropExchange(CPropExchange* pPX){ ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor)); COleControl::DoPropExchange(pPX); PX_String(pPX, "URL", m_strURL);}
물론, 스트링이 아닌경우는 PX_타입 의 다른 함수를 쓴다. OK?
ATL 에서 param 쓰기
MSDN 문서의 내용
Property Persistence 를 이용하기 위해 필요한 인터페이스는 다음의 세가지이다. atl object 클래스에 세가지 인터페이스를 상속받도록 한다.
class ATL_NO_VTABLE CBullsEye : .... // Persistence public IPersistStreamInitImpl<CBullsEye>, public IPersistStorageImpl<CBullsEye>, public IPersistPropertyBagImpl<CBullsEye>,};
다음의 매크로를 추가한다.
BEGIN_COM_MAP(CBullsEye) ... // Persistence COM_INTERFACE_ENTRY(IPersistStreamInit) COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit) COM_INTERFACE_ENTRY(IPersistStorage) COM_INTERFACE_ENTRY(IPersistPropertyBag) END_COM_MAP()
이것을 마친후에는, 프라퍼티맵 에 프라퍼티들을 추가하면된다.
내가 해본것
위 상속을 받고 매크로를 넣는것이야 카피&패스트 하면 끝이 나고, 문제는 프라퍼티 맵에 추가하는 것이다.
BEGIN_PROP_MAP(Calala) PROP_ENTRY("URL", 2, CLSID_alala)END_PROP_MAP()
이것이 내 코드중 일부인데, "URL" 은 프라퍼티의 이름, 2 는 idl 내의 id 이다. 세번째 인자는 물론 그 클래스의 ID.
이작업 외에도, 실제로 그 프라퍼티를 추가해야 한다. VARIANT 타입으로 URL 을 추가했다. 프라퍼티 추가후 get_프라퍼티, put_프라퍼티 함수 역시 채워놓아야 한다.( 이 함수들이 불리게 된다. )
제한
흠 위 샘플은 컴포지트 컨트롤을 만들었을때의 경우다.
정리
- 필요한 인터페이스 세가지를 상속받는다.
- 위 세가지 인터페이스에 대한 매크로를 추가한다.
- 배리언트 타입의 프라퍼티를 추가한다.
- 그 프라퍼티의 id 를 알고, 프라퍼티 맵에 추가한다.
제기랄
음. ATL 에서 코딩하고 맞게 돌아가는것을 확인했는데, 다시 돌려보니 되지 않았다. invoke fail 이란 트레이스가 찍혔는데, 이유를 알수가 없었다. 그냥 Load 를 오버라이딩 해서 임시로 넘어갔으나, 후에 파람이 늘어나면 문제가 될거다.
STDMETHOD(Load)( LPPROPERTYBAG pPropBag, LPERRORLOG pErrorLog ) { CComBSTR bstrURL; CComVariant vtVal; HRESULT hr = pPropBag->Read( L"URL", &vtVal, pErrorLog ); if ( SUCCEEDED( hr ) && VT_BSTR == vtVal.vt ) { bstrURL = vtVal.bstrVal; m_strURL = (LPCTSTR)_bstr_t(bstrURL); } return hr; }
왜 이런지 모르겠군. 젠장할. MSDN 에서 이쪽에 버그가 있다는 글은 봤는데, 설마 그 버그가 아직 남아있는건지.. 짜증나서 그냥 이코드로 간다.
CategoryVisualCPP CategoryComponentObjectModel
참고:
- MSDN::Write ActiveX Controls Using Custom Interfaces Provided by ATL 3.0, Part II
검색어: IPersistPropertyBag
VisualCPP/액티브X에서param태그값얻기 (2005-02-11 08:34:22에 가(이) 마지막으로 수정)
'기본 카테고리' 카테고리의 다른 글
일본CF 다시 Japan CF (0) | 2007.07.20 |
---|---|
11.메모리,파일입출력,클립보드,스레드 (0) | 2007.07.18 |
CString , BSTR ,char ,CComVariant 간의 자료형변환 (0) | 2007.07.12 |
Hosting the Windows Media Player Control in a Windows Application (0) | 2007.07.12 |
atl param (0) | 2007.07.11 |