The information in this article applies to:
SYMPTOMSAn ATL event sink defined with SINK_ENTRY or SINK_ENTRY_EX will fail to catch an event when an enum is used as one of the parameters for the event. The failure code returned by IDispatch::Invoke is "0x80070057 (E_INVALIDARG - The parameter is incorrect)." The event will succeed in another container, such as Visual Basic. CAUSEIDispEventImpl's GetFuncInfoFromID method checks the type of the event parameters and, on encountering type VT_USERDEFINED, calls GetUserDefinedType. This method currently checks only for TKIND_ALIAS ("typedef struct" data types) and not TKIND_ENUM. RESOLUTIONThere are several ways to work around this problem. One method is to use the SINK_ENTRY_INFO macro and define an _ATL_FUNC_INFO structure to provide type information for the event method. Use a VT_I4 type for the enum parameter. For an example, and for more information on SINK_ENTRY_INFO, see the following article in the Microsoft Knowledge Base: Q194179 SAMPLE: AtlEvnt.exe Creates ATL Sinks Using IDispEventImplIf you are using IDispEventImpl<> for the sink, you can override the virtual function GetFuncInfoFromID. A simple override is as follows:
The most direct approach when using IDispEventImpl<>is to change the implementation of GetUserDefinedType in Atlcom.h. At line 3968, after the code block that begins "if(pta && pta->typekind == TKIND_ALIAS)", a second if statement could be inserted that would set the correct VARTYPE for enumerations. This block could be written as follows:
STATUSMicrosoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. REFERENCESFor additional information, click the article numbers below to view the articles in the Microsoft Knowledge Base: Q194179 SAMPLE: AtlEvnt.exe Creates ATL Sinks Using IDispEventImpl Q181277 SAMPLE: AtlSink Uses ATL to Create a Dispinterface SinkSee also the ATL Articles in the Visual C++ documentation, specifically "ATL Collections and Enumerators" and "Event Handling in ATL." Additional query words:
Keywords : kbActivexEvents kbAutomation kbCOMt kbConnPts kbVC600bug kbATL300bug kbDSupport kbGrpMFCATL |
Last Reviewed: November 24, 1999 © 2000 Microsoft Corporation. All rights reserved. Terms of Use. |