DOCUMENT:Q247273 26-JUN-2001 [visualc] TITLE :BUG: IOleObjectImpl<>::DoVerb Does Not Process Positive Verbs PRODUCT :Microsoft C Compiler PROD/VER:WINDOWS:2.0,2.1,3.0 OPER/SYS: KEYWORDS:kbActiveX kbCOMt kbCtrlCreate kbVC500bug kbVC600bug kbATL300bug kbDSupport kbGrpDSMFCAT ====================================================================== ------------------------------------------------------------------------------- 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 template class IMyOleObjectImpl : public IOleObjectImpl { public: STDMETHODIMP DoVerb(LONG iVerb, LPMSG pMsg, IOleClientSite* pActiveSite, LONG lindex, HWND hwndParent, LPCRECT lprcPosRect ) { if (iVerb > 0) { iVerb = OLEIVERB_PRIMARY; IOleObjectImpl::DoVerb(iVerb, pMsg, pActiveSite, lindex, hwndParent, lprcPosRect); return OLEOBJ_S_INVALIDVERB; } return IOleObjectImpl::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, public IMyOleObjectImpl, public CComCoClass { // 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 kbGrpDSMFCATL Technology : kbAudDeveloper kbATLsearch kbATL200 kbATL300 kbATL210 Version : WINDOWS:2.0,2.1,3.0 Issue type : kbbug ============================================================================= THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY. Copyright Microsoft Corporation 2001.