The information in this article applies to:
SYMPTOMSOLE Automation code that successfully controlled previous versions of Microsoft Excel may fail with Microsoft Excel 97. If the code was generated by a scripting language, you may get an error message similar to the following:
CAUSE
This problem can be caused by an improperly implemented OLE Automation
Controller. An OLE Automation Controller actually makes the calls to a
server application's IDispatch interface to allow that server to be
controlled by the client.
Previous versions of Microsoft Excel implemented their collection accessor functions as methods. For example, consider the following line of Visual Basic For Applications, Excel edition code:
Workbooks, Worksheets, and Range are implemented as methods in Microsoft
Excel version 5.0 and 7.0. However, Microsoft Excel 97 implements these
same calls as properties.
If OLE Automation Controllers break when they try to drive Excel 97, it is usually because they are passing DISPATCH_METHOD as the wFlags parameter of IDispatch::Invoke. Because these functions are no longer implemented as methods in Microsoft Excel 97, the Invoke method failS with DISP_E_MEMBERNOTFOUND. If you are using a scripting language on top of the controller, you generally get an error message similar to the one mentioned above. RESOLUTION
To resolve this problem, modify the OLE Automation Controller code so that
calls to IDispatch::Invoke include DISPATCH_PROPERTYGET as part of the
wFlags parameter. Though you can pass DISPATCH_PROPERTYGET by itself where
these property calls are being made, the best solution is to logically OR
this flag with DISPATCH_METHOD (DISPATCH_PROPERTYGET | DISPATCH_METHOD).
By doing this, you ensure that the function call succeeds
regardless of whether it has been implemented as a property or a method.
STATUSMicrosoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. MORE INFORMATIONDevelopers who have used the Class Wizard in Visual C++ to generate wrapper classes to automate Microsoft Excel may also encounter this problem if they generated the classes from an older type library. Class Wizard reads the type library and calls IDispatch::Invoke with whichever flag is appropriate. When used with an older type library, it sees that the collection accessors are implemented as methods, so it uses the DISPATCH_METHOD flag when it calls these functions. The solution is the same. Logically OR DISPATCH_METHOD with DISPATCH_PROPERTYGET for the wFlags parameter in the Dispatch helper function calls. This results in IDispatch::Invoke being properly called by the wrapper classes. REFERENCES
For additional information, please see the following:
Q141759 SAMPLE: XLCLIENT: Automation Client for Excel Additional query words: XLClient
Keywords : kbinterop kbtool kbVC kbVC200 kbVC400 kbVC500 |
Last Reviewed: October 1, 1999 © 2000 Microsoft Corporation. All rights reserved. Terms of Use. |