BUG: IOleObjectImpl<>::DoVerb Does Not Process Positive Verbs Correctly

ID: Q247273


The information in this article applies to:
  • The Microsoft Active Template Library (ATL), versions 2.0, 2.1, 3.0


SYMPTOMS

According to documentation for IOleObject::DoVerb, unknown positive verbs should be treated as the primary verb and OLEOBJ_S_INVALIDVERB should be returned. ATL's implementation of IOleObject::DoVerb does nothing for positive verbs and returns E_NOTIMPL.


CAUSE

This is a bug in the ATL implementation of IOleObject::DoVerb.


RESOLUTION

To correct this behavior, you can override the ATL function IOleObjectImpl::DoVerb. You need to override the IOleObjectImpl::DoVerb function for every ATL object that needs to have the correct processing for IOleObject::DoVerb. Because this may need to be done for more than one ATL COM object in your project, it is recommended that you create a new template class derived from IOleObjectImpl. You can use the following steps to accomplish this:

  1. Create a new header file and insert it into your ATL project. Give the header file the name MyIOleObjectImpl.h.


  2. Open MyIOleObjectImpl.h created in step 1 and copy the following code into the file:
    
    #ifndef MYIOLEOBJECTIMPL_H
    #define MYIOLEOBJECTIMPL_H
    
    #include <atlctl.h>
    
    template <class T>
    class IMyOleObjectImpl : public IOleObjectImpl<T>
    {
    public:
      STDMETHODIMP DoVerb(LONG iVerb, LPMSG pMsg, IOleClientSite* pActiveSite, LONG lindex, HWND hwndParent, LPCRECT lprcPosRect )
      {
         if (iVerb > 0)
         {
            iVerb = OLEIVERB_PRIMARY;
            IOleObjectImpl<T>::DoVerb(iVerb, pMsg, pActiveSite,  lindex, hwndParent, lprcPosRect);
            return  OLEOBJ_S_INVALIDVERB; 
         }
    
         return IOleObjectImpl<T>::DoVerb(iVerb, pMsg, pActiveSite,  lindex, hwndParent, lprcPosRect);
      }
    };
    
    #endif 


  3. Save and close MyIOleObjectImpl.h.


  4. Open your ATL COM object header file and add the following code before the class declaration:
    
    #include "MyIOleObjectImpl.h" 


  5. Inside of your ATL COM object class derivation, change the existing derivation from IOleObjectImpl to IMyOleObjectImpl. The code should appear similar to the following:
    
    class ATL_NO_VTABLE CATLCONTROLObj1 : 
    // Rest of classes omitted for brevity.
    //	public IOleObjectImpl<CATLCONTROLObj1>,
    	public IMyOleObjectImpl<CATLCONTROLObj1>,
    	public CComCoClass<CATLCONTROLObj1, &CLSID_ATLCONTROLObj1>
    {
    // Rest of code omitted for brevity.
    }; 


  6. Save your ATL COM object header file and rebuild the project.


After performing these steps, you should notice that IOleObject::DoVerb is implemented correctly when a positive verb is passed.


STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article.


REFERENCES

Please see the IOleObject::DoVerb documentation in MSDN.

Additional query words:

Keywords : kbActiveX kbCOMt kbCtrlCreate kbVC500bug kbVC600bug kbATL300bug kbDSupport kbGrpMFCATL
Version : WINDOWS:2.0,2.1,3.0
Platform : WINDOWS
Issue type : kbbug


Last Reviewed: January 12, 2000
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.