This article was previously published under Q198996
When an application tries to call a Component Object Model (COM) method while the user has displayed the system menu from the application's taskbar button, the COM call fails with RPC_E_CANTCALLOUT_ININPUTSYNCCALL.
The following list outlines in detail what occurs:
A thread creates a window that has a corresponding taskbar button.
The thread makes outgoing COM calls in response to posted window messages, such as WM_TIMER messages.
The user right-clicks the taskbar button or sets the keyboard focus on the button. Then the user presses the SHIFT+F10 key combination or the Application key.
The shell sends a message to the thread using the SendNotifyMessage function. The default message handler displays the system menu and runs a message loop to service the menu.
The thread receives and processes a posted message that causes it to attempt an outgoing COM call.
The COM call fails with RPC_E_CANTCALLOUT_ININPUTSYNCCALL.
COM does not allow normal outgoing COM method calls from a thread that is currently servicing a SendMessage request. For additional information, click the article number below to view the article in the Microsoft Knowledge Base:
131056 PRB: Synch OLE Call Fails in Inter-Process/Thread SendMessage
When the system menu is displayed in the taskbar, the thread that owns the window is servicing a SendNotifyMessage request. On Windows 95, Windows 98, and Windows NT 4.0, COM does not distinguish between SendMessage and SendNotifyMessage.
This bug was corrected in Microsoft Windows 2000. In Windows 2000, COM uses the InSendMessageEx function to detect a true SendMessage request.
To work around this problem if the application is running Windows 95, Windows 98, or Windows NT 4.0, use one of the following methods:
Allow outgoing COM calls to fail with RPC_E_CANTCALLOUT_ININPUTSYNCCALL.
Call InSendMessage before you make any outbound COM calls in response to posted window messages. If InSendMessage returns TRUE, do not attempt an outgoing COM call.
Make outgoing COM calls on another thread.
Prevent the taskbar from creating a button for the window. To do this, create the window with the WS_EX_TOOLWINDOW extended style, or create a hidden window, and make the hidden window the owner of the visible window.
Microsoft has confirmed that this is a bug in the Microsoft products that are listed at the beginning of this article.