INFO: COM Method Call In WM_PAINT Handler Returns 0x80010005Last reviewed: January 22, 1998Article ID: Q179692 |
The information in this article applies to:
SUMMARYWhen calling methods on a COM server from within OnDraw() or a WM_PAINT message handler of an MFC client application, you may receive an HRESULT of 0x80010005 (RPC_E_CANTCALLOUT_INEXTERNALCALL - it is illegal to call out while inside message filter) as the return value of a COM call to a server.
MORE INFORMATIONMFC has a default implementation of IMessageFilter(COleMessageFilter). IMessageFilter is used by COM servers and clients to selectively handle incoming and outgoing COM messages while waiting for a response from synchronous calls. MFC's implementation allows processing of WM_PAINT messages (to keep the UI updated) on the COM client side, while waiting on a synchronous COM call to a server (for example, a call to an automation method). This is done through IMessageFilter::MessagePending(). Thus, when calling a COM server method inside of a WM_PAINT handler, you could already be in the middle of a call to the server, and therefore receive the error 0x80010005. As with any Windows application, the code in WM_PAINT handlers should be minimal. If at all possible, do not have any calls to COM servers in WM_PAINT handlers. To resolve this problem you could use any one of the following three workarounds:
BOOL CmyApp::InitInstance() { // Initialize OLE libraries and registers default message filter. if (!AfxOleInit()) { AfxMessageBox(IDP_OLE_INIT_FAILED); return FALSE; } CWinThread* pThread = AfxGetThread(); if (pThread != NULL) { // Destroy message filter, thereby unregistering it. delete pThread->m_pMessageFilter; pThread->m_pMessageFilter = NULL; // Create the new message filter object. pThread->m_pMessageFilter = new CMyMessageFilter; ASSERT(AfxOleGetMessageFilter() != NULL); // Register the new message filter object. AfxOleGetMessageFilter()->Register(); } ... ... }For more information on how message filters work, please see the online documentation on IMessageFilter and COleMessageFilter.
REFERENCES"Inside OLE", second edition, by Kraig Brockschmidt, Chapter 6, "Local/Remote Transparency," published by Microsoft Press. Visual C++ Books Online and the MFC source code for the functions mentioned in this article.
|
Additional query words: 80010005 2147549189 IMessageFilter MessagePending
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |