PushButon类,定义了一个Caption属性。idl文件:interface IPushButton : IDispatch{
[propget, id(1)] HRESULT Caption([out, retval] BSTR* pVal);
[propput, id(1)] HRESULT Caption([in] BSTR newVal);
};pushbutton.h:STDMETHOD(get_Caption)(BSTR* pVal);
STDMETHOD(put_Caption)(BSTR newVal);
相关实现在pushbutton.cpp已添加属性映射:PROP_ENTRY_TYPE("Caption", 1, CLSID_NULL, VT_BSTR)
现在的问题是,使用ActiveX Test Container测试,Invoke get_Caption/put_Caption时不会调用其实现代码,(我在get_caption/put_caption下了断点,断点没有触发,使用ie调试时也不会触发断点)求教如何实现属性与其get/put的关联。

解决方案 »

  1.   

    写了个程序测试,结果发现不是没有关联,已经关联了。
    CComPtr<IPushButton> pBtn = NULL;
    CAxWindow btn = GetDlgItem(IDC_BTN);
    btn.QueryControl(&pBtn);
    pBtn->put_Caption(CComBSTR("test"));
    可以成功修改Caption属性。是不是ActiveX Control Test Container不支持Windowless控件?在浏览器中,JavaScript可以使用控件的事件,但是无法设置属性。
    在VB6中,使用时会出现未指定的错误,但是去掉属性就一切正常,也可以使用控件事件。
      

  2.   

    经过一系列测试,得出最终结论:IDispatch暴露的方法VC可以调用,IE和VB6无法调用。回调事件二者都可以调用这是肿么回事
      

  3.   

    08下通过向导添加的是这样的
    DISP_PROPERTY_EX_ID(CXXCtrl, "Caption", dispidCaption, GetCaption, SetCaption, VT_BSTR)
      

  4.   


    是用ATL向导添加的额,不过没把Caption作为固有属性PROP_ENTRY_TYPE("Caption", 1, CLSID_NULL, VT_BSTR)是自己写的,dispid是1但是为什么VC程序可以正常使用,而ActiveX Control Test Container和IE无法调用IDispatch暴露的方法呢。连接点事件二者都可以正常使用。