Solved

Problem with OLE local server

Posted on 1997-11-19
2
447 Views
Last Modified: 2013-11-20
I have the following problem. I have to exe and they both are client and server. When one of them creates another that immideatly resiters itself in ROT. When first exe wants to connect to second it retrieves its interface pointer from ROT using GetActiveObject. It works fine, but now in one exe I have another tread which also needs to connect to server. It is impossible to connect directly from
this thread so I use custom message which is sent to main thread and from main thread's message handler I try to retreive server pointer from ROT. It must work but I get RPC error RPC_E_CANTCALLOUT_ININPUTSYNCCALL( error occured in RPCRT4.DLL) and server moniker in ROT is removed.  
0
Comment
Question by:galkin
2 Comments
 
LVL 1

Accepted Solution

by:
dkremer earned 100 total points
ID: 1310292
Hi
I'm qouting a MS KB article, it'll answer you're question :)

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

Last reviewed: August 8, 1996
Article ID: Q131056 The information in this article applies to:

Microsoft OLE Libraries for Windows and Win32s, version 2.03 •Microsoft OLE libraries included with:

    - Microsoft Windows NT version 3.5
    - Microsoft Windows 95

SYMPTOMS

A synchronous OLE call made by the recipient of an inter-process/inter- thread SendMessage fails with RPC_E_CANTCALLOUT_ININPUTSYNCCALL.

CAUSE

The cause is discussed in detail in the "More Information" section of this article.

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 Volume 1 for the categories of OLE calls. An understanding of these categories is required for this article.

The majority of OLE calls are synchronous calls. A synchronous call to a different process yields to that process and waits for a reply from that process. In addition, OLE has input-synchronized calls that relate to the inplace-activation interfaces. Input-synchronized calls are implemented using 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. The deadlock occurs because a message for the sender could be present at the top of the shared system queue, and this prevents other tasks, including the recipient of the SendMessage, from retrieving their messages from the system queue until the sender does. The sender cannot retrieve its message because it is waiting for the inter-process/inter-thread SendMessage to return.

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

OLE determines if the caller of the synchronous call is a recipient of an input-synchronized call by using the InSendMessage() API. This broad check prevents a synchronous call from being made if the caller is currently a recipient of any inter-process/inter-thread SendMessage.

Hope it helps,
    - Dror

0
 
LVL 7

Author Comment

by:galkin
ID: 1310293
Thank you. I have already found this MS kb technical article.
0

Featured Post

Networking for the Cloud Era

Join Microsoft and Riverbed for a discussion and demonstration of enhancements to SteelConnect:
-One-click orchestration and cloud connectivity in Azure environments
-Tight integration of SD-WAN and WAN optimization capabilities
-Scalability and resiliency equal to a data center

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
How do you programatically show and hide the Windows 10 On-Screen-Keyboard? 3 795
sameEnds challenge 3 179
Hibernate methods 2 77
matchUp  challenge 9 115
This is to be the first in a series of articles demonstrating the development of a complete windows based application using the MFC classes.  I’ll try to keep each article focused on one (or a couple) of the tasks that one may meet.   Introductio…
Introduction: Finishing the grid – keyboard support for arrow keys to manoeuvre, entering the numbers.  The PreTranslateMessage function is to be used to intercept and respond to keyboard events. Continuing from the fourth article about sudoku. …
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.

840 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question