Microsoft KB Archive/114372

= PRB: "ASSERTION FAILED" with Excel 5.0 Automation Classes =

Article ID: 114372

Article Last Modified on 3/7/2005

-

APPLIES TO


 * Microsoft Foundation Class Library 4.2, when used with:
 * Microsoft Visual C++ 1.5 Professional Edition

-



This article was previously published under Q114372



SYMPTOMS
When calling methods of Automation objects for Microsoft Excel 5.0, you may receive the following message:

ASSERTION FAILED oledisp2.cpp, line 352!



CAUSE
ClassWizard creates the COleDispatchDriver-derived classes for use with Excel 5.0 by reading the Excel type library, XLEN50.OLB. The information in that type library states that some parameters passed to, and return values received from IDispatch::Invoke are of type VARIANT. These VARIANTs are unions of several data types with a VARTYPE member specifying the actual contained data. MFC 2.5 source file OLEDISP2.CPP contains the following code at line 352: ASSERT(vtRet == vaResult.vt); This assertion checks the VARTYPE member to determine what is actually contained in the VARIANT. The type library information is saying that this should be VT_VARIANT, while the actual returned value is different.

Refer to the header file VARIANT.H in your include directory for the possible data types and their VARTYPE specifiers.



RESOLUTION
The intent of this ASSERT is to ensure strong type checking of arguments used in IDispatch::Invoke calls to the Automation server. There are several solutions:
 * The function of the class generated by ClassWizard may be edited to return the actual type specified by the VARTYPE member of the VARIANT after the call to IDispatch::Invoke. This requires stepping through the code up to the point after the call to Invoke and examining the VARTYPE vt member of the returned VARIANT. Match this against the possible values in VARIANT.H and then alter the member function of the class to use and return this type.
 * Another solution is to directly edit the MFC source code. Move the ASSERT on line 352 to line 351 in OLEDISP2.CPP, inside the closing brace of the if(vtRet!=VT_VARIANT) block.

Before these changes were done, ignoring the assertion would cause the entire VARIANT to be returned. With the first change listed above, the assertion goes away and only the correct member of the VARIANT specified by VARESULT.VT is returned. The code for each member function must be edited to reflect this. With the second change listed above, the assertion goes away and the entire VARIANT struct is returned. After this change occurs, a similar assertion may be placed in the function for strong type checking.

In Visual C++ for Windows versions 1.51 and later and Visual C++ 32-bit edition, MFC has been modified as described in the second solution above. If you wish to perform strong type checking on VARIANT arguments to an automation method, place an assertion in your COleDispatchDriver derived class member function.

Sample Code
// Machine generated IDispatch driver class(es) created with // ClassWizard. // This is the function generated by ClassWizard VARIANT Worksheet::Application {    VARIANT result; InvokeHelper(0x94,DISPATCH_METHOD,VT_VARIANT,(void*)&result,NULL); return result; } // This is the same function with change #1 LPDISPATCH Worksheet::Application {    LPDISPATCH lpDispatch; InvokeHelper(0x94, DISPATCH_METHOD, VT_DISPATCH,                (void*)&lpDispatch, NULL); return lpDispatch; } // This is the same function with change #2 VARIANT Worksheet::Application {    VARIANT result; InvokeHelper(0x94,DISPATCH_METHOD,VT_VARIANT,(void*)&result,NULL); ASSERT(result.vt == VT_DISPATCH); return result.; }

Additional query words: automation dispatch ole oledisp2

Keywords: kbnoupdate kb16bitonly kbprb KB114372

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.