Select the product you need help with
- Internet Explorer
- Windows Phone
- More products
MFC application stops responding when you initialize the application as a multithreaded apartment in Visual C++ .NET or in Visual C++ 2005
Article ID: 828643 - View products that this article applies to.
When you use the following CoInitializeEx method call to initialize a Microsoft Foundation Class Library (MFC) application as a multithreaded apartment (MTA), the application may stop responding:
An MFC application uses a lot of thread local storage to store thread state information and to process state information. Therefore, an MFC application is not compatible with a free threaded programming model. For example, if you write an application that displays a user interface (UI) and that also uses some remote Component Object Model (COM) objects, during any method calls to the remote COM objects, the UI may stop responding. This behavior occurs because the UI thread that you initialize as an MTA thread by using the CoInitializeEx(..., COINIT_MULTITHREADED) method makes blocking Remote Procedure Calls (RPCs) to another COM apartment. While the UI thread waits for the RPC response message, any window messages that are posted to the queue of the UI thread are accumulated. Therefore, windows that were created by the UI thread may stop responding. This behavior may cause end users to prematurely quit the application.
To work around this problem, run the MFC application (UI thread) in a Single Threaded Apartment (STA). To do this, initialize the MFC application by using the CoIntializeEx(..., COINIT_APARTMENTTHREADED) method. When an STA thread makes an RPC call, the thread drops into a COM-managed message loop (to dispatch window messages), and COM creates another thread to receive the RPC response message. Because the COM-managed message loop supports the dispatch of window messages, the UI can keep running.
Steps to Reproduce the Behavior