액티브 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_프라퍼티 함수 역시 채워놓아야 한다.( 이 함수들이 불리게 된다. )

제한

흠 위 샘플은 컴포지트 컨트롤을 만들었을때의 경우다.

정리

  1. 필요한 인터페이스 세가지를 상속받는다.
  2. 위 세가지 인터페이스에 대한 매크로를 추가한다.
  3. 배리언트 타입의 프라퍼티를 추가한다.
  4. 그 프라퍼티의 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에 가(이) 마지막으로 수정)

+ Recent posts