The information in this article applies to:
SYMPTOMSAn application that calls certain OLE Automation functions can block the global broadcast of Windows messages. For example, when a user double- clicks a desktop icon, the program associated with the icon might be blocked from starting and Windows Explorer might hang. CAUSECertain Automation APIs (example:VariantChangeType) cause OLEAut32.dll to create a hidden top-level window that processes the WM_WININICHANGE message (for example, to get notifications like time zone changes, and so forth). This is used to invalidate OLE Automation's national language setting (NLS) cache. If the thread that called this function does not service the message queue, the hidden top-level window is starved of messages. Any global broadcast of messages using the SendMessage API will cause the broadcasting application to block indefinitely. Under the MTA programming model, a thread is not obligated to service the message queue. Hence an MTA thread that calls these Automation APIs can cause this problem. RESOLUTIONThere is no fixed set of OLE Automation APIs that create the hidden top- level window. However, the hidden top-level window is created the first time Ole Automation runtime needs to look at the NLS information. To work around this, spin a secondary thread and call an OLE Automation API first on the secondary thread (for example, VariantChangeType, changing from BSTR). This creates the hidden top-level window the secondary thread, and then pumps messages on the secondary thread. As a result, the hidden top- level window does not block broadcast messages. You can continue to use your automation methods in other threads. Send a WM_ QUIT message or use another form of inter-thread communication from the primary thread to end the secondary thread. STATUSMicrosoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. We are researching this bug and will post new information here in the Microsoft Knowledge Base as it becomes available. MORE INFORMATIONSteps to Reproduce BehaviorUse the following code to develop a console application:Sample Code
Run this application. Run another application that broadcasts a message
(for example, double click a .doc icon on the desktop). A message is
broadcast to all the top-level windows that are using either SendMessage or
a non-blocking variation of the SendMessage API (such as
SendMessageTimeout). The broadcasting application is either blocked (hung)
indefinitely or hung for the period of time it takes the call to timeout.
One work around for the problem is to create a secondary thread from the primary thread. After you have done this, call an automation method on the secondary thread's procedure (the secondary thread will create the hidden top-level window). Create a message loop to process the messages in the secondary thread. After everything is finished, close the secondary thread from the primary thread. Since there is a message pump in the secondary thread, any broadcasted message will be processed. Sample Code
Additional query words: OLE COM
Keywords : kbCOMt kbOLEApp kbOLEArc kbOLE20 |
Last Reviewed: January 13, 2000 © 2000 Microsoft Corporation. All rights reserved. Terms of Use. |