PRB: Synch OLE Call Fails in Inter-Process/Thread SendMessage

This article was previously published under Q131056
SYMPTOMS
A synchronous OLE call made by the recipient of an inter-process/inter-thread SendMessage fails with RPC_E_CANTCALLOUT_ININPUTSYNCCALL(0x8001010D).
CAUSE
The cause is discussed in detail in the "More Information" section of thisarticle.
RESOLUTION
Use PostMessage instead of an inter-process/inter-thread SendMessage.
STATUS
This behavior is by design.
MORE INFORMATION
See the beginning of chapter 13 in the OLE 2 Programmer's Reference Volume1 for the categories of OLE calls. An understanding of these categories isrequired for this article.

The majority of OLE calls are synchronous calls. A synchronous call to adifferent process yields to that process and waits for a reply from thatprocess. In addition, OLE has input-synchronized calls that relate to theinplace-activation interfaces. Input-synchronized calls are implementedusing an inter-process/inter-thread SendMessage.

16-bit Windows doesn't allow a task to yield while in an inter-process/inter-thread SendMessage because a system deadlock could occur. Thedeadlock occurs because a message for the sender could be present at thetop of the shared system queue, and this prevents other tasks, includingthe recipient of the SendMessage, from retrieving their messages from thesystem queue until the sender does. The sender cannot retrieve its messagebecause it is waiting for the inter-process/inter-thread SendMessage toreturn.

In 32-bit Windows, each process has its own system queue and thisarchitecture normally prevents deadlock problem from occurring. However,when one process is inplace active in another process's window, the systemqueues of the two processes are synchronized as in 16-bit windows, so thedeadlock could occur. To prevent this, OLE stops synchronous OLE calls frombeing made while the caller is the recipient of an input-synchronized call.

OLE determines if the caller of the synchronous call is a recipient ofan input-synchronized call by using the InSendMessage() API. This broadcheck prevents a synchronous call from being made if the caller iscurrently a recipient of any inter-process/inter-thread SendMessage.
2.0 2.00 Thread
Ιδιότητες

Αναγνωριστικό άρθρου: 131056 - Τελευταία αναθεώρηση: 07/11/2005 18:39:08 - Αναθεώρηση: 2.2

Microsoft Platform Software Development Kit-January 2000 Edition

  • kbprb KB131056
Σχόλια