Knowledge Base

FIX: ClassWizard Incorrectly Reads LPDISPATCH Params from .TLB

Article ID: 131044

Article Last Modified on 12/1/2003


APPLIES TO


This article was previously published under Q131044

SYMPTOMS

ClassWizard generates improper COleDispatchDriver derived member functions for methods that contain one or more LPDISPATCH* parameters. Specifically, ClassWizard generates member functions using a LPDISPATCH parameter instead of LPDISPATCH*. In other words, the asterisk (*) is missing.

RESOLUTION

To correct this problem, you must edit the COleDispatchDriver derived member directly.

For example, assume there is a type library (.TLB file) for an object that supports a method that returns a void and accepts an LPDISPATCH* as its only parameter. When ClassWizard reads the .TLB file, it generates a new class from COleDispatchDriver. The method for the member function that returns a void and accepts an LPDISPATCH* parameter ends up with this incorrect definition:
   void ITestObject::TestMethod(LPDISPATCH lpDispPtr)
   {
      static BYTE BASED_CODE parms[] =
         VTS_DISPATCH;
      InvokeHelper(0x1, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
         lpDispPtr);
   }
				
To correct this problem, change the parameter type to LPDISPATCH*, and modify the parms[] array so that it contains a corresponding VTS_PDISPATCH entry instead of VTS_DISPATCH, as illustrated here:
   void ITestObject::TestMethod(LPDISPATCH* lpDispPtr)
   {
      static BYTE BASED_CODE parms[] =
         VTS_PDISPATCH;
      InvokeHelper(0x1, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
         lpDispPtr);
   }
					

STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. This was fixed in Visual C++ version 5.0.

Keywords: kbbug kbfix kbvc500fix kbautomation kbwizard KB131044