About ActiveX Control

解决方案 »

  1.   

    因总是乱码,故内容如下:
    高分求助ATL高手!
    因我不擅长于C++,我用的是 Win32 汇编开发无窗口控件。有关连接点、持续性等等接口都测试OK,但IOleInPlaceObjectWindowless接口收不到OnWindowMessage消息流。而我用ATL开发的无窗口控件却有收到。在ATL中我所用了如下代码:
    class ATL_NO_VTABLE CAtlTest1 : 
    public CComObjectRootEx<CComSingleThreadModel>,
    public IDispatchImpl<IAtlTest1, &IID_IAtlTest1, &LIBID_ATLTESTLib>,
    public CComControl<CAtlTest1>,
    public IPersistStreamInitImpl<CAtlTest1>,
    public IOleObjectImpl<CAtlTest1>,
    public IViewObjectExImpl<CAtlTest1>,
    public IOleInPlaceObjectWindowlessImpl<CAtlTest1>,
    public CComCoClass<CAtlTest1, &CLSID_AtlTest1>
    {
    public:
    CAtlTest1(){}DECLARE_REGISTRY_RESOURCEID(IDR_ATLTEST1)
    DECLARE_PROTECT_FINAL_CONSTRUCT()BEGIN_COM_MAP(CAtlTest1)
    COM_INTERFACE_ENTRY(IAtlTest1)
    COM_INTERFACE_ENTRY(IDispatch)
    COM_INTERFACE_ENTRY(IViewObject)
    COM_INTERFACE_ENTRY(IOleObject)
    COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless)
    COM_INTERFACE_ENTRY(IOleInPlaceObject)
    COM_INTERFACE_ENTRY(IPersistStreamInit)
    END_COM_MAP()BEGIN_PROP_MAP(CAtlTest1)
    END_PROP_MAP()BEGIN_MSG_MAP(CAtlTest1)
    END_MSG_MAP()public:
    HRESULT OnDraw(ATL_DRAWINFO& di)
    {
    return S_OK;
    }
    };而我在汇编中也实现了不仅仅如上的接口(还包括ActiveX控件的其它接口),为什么就没有收到OnWindowMessage消息流。微软文档不是说无窗口控件只要实现了IOleInPlaceObjectWindowless接口就会收到消息吗?难道窗口不知道这个控件是Windowless控件吗?
    而且,我用汇编开发的控件为何IOleObject::DoVerb只收到鼠标双击的消息。而我用以上ATL代码,控件一加载就能收到一条DoVerb的消息(iVerb==OLEIVERB_INPLACEACTIVATE).我对照了ATL模板中的实现代码。并没有明显不同呀。敬请相关高手回答。MSDN相关资源:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/html/fabd6a0a-7b0c-4c99-af22-8b117addd5f7.asp
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/html/fabd6a0a-7b0c-4c99-af22-8b117addd5f7.asp