<div dir="ltr"><div class="gmail_extra">There is another problem with SimpleIPC on Windows.<br></div><div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_extra">This same problem was experienced in @Juha's post "SimpleIPC and TWinMsgServerComm.PeekMessage":</div><div class="gmail_extra"><a href="http://lists.freepascal.org/pipermail/fpc-devel/2013-October/032871.html">http://lists.freepascal.org/pipermail/fpc-devel/2013-October/032871.html</a></div></div><div class="gmail_extra"><br></div><div class="gmail_extra">TWinMsgServerComm.PeekMessage never waits for a Timeout because of this line:<br></div><div class="gmail_extra">> MsgWaitForMultipleObjects(1,FHWND,False,TimeOut,QS_SENDMESSAGE);<br></div><div class="gmail_extra"><br></div><div class="gmail_extra">It always fails and returns immediately WAIT_FAILED with GetLastError saying "Invalid handle". As per documentation at MSDN, MsgWaitForMultipleObjects does not work with window handles. Funny thing is that I am pretty sure that this line used to work in the past, on much older OS, perhaps XP before SP3 or earlier. It used to be able to wait, but definitely not any more (tested on 7 SP1 and XP SP3).</div><div class="gmail_extra"><br></div><div class="gmail_extra">I suspect that the reason why it might have worked in the past is because MsgWaitForMultipleObjects behind the scene (according to MS engineers) also waits for a signal on the current thread (in addition to signals on whatever handles you provide). I also suspect that on older OS versions MsgWaitForMultipleObjects did not fail and return immediately if one of those handles was invalid, meaning that it will continue waiting for a signal to the current thread, which would then get signalled when a thread message arrived and it actually would perform as intended.</div><div class="gmail_extra"><br></div><div class="gmail_extra">On newer OS, it seems that MsgWaitForMultipleObjects always fails and returns immediately if one of the supplied handles was invalid for its purposes, e.g. window handle is supplied. It won't bother waiting for a signal on thread behind the scene.</div><div class="gmail_extra"><br></div><div class="gmail_extra">It can be resolved in one of 2 ways:</div><div class="gmail_extra">A) MsgWaitForMultipleObjects(0, nil, False, TimeOut, QS_SENDMESSAGE); // wait for thread messages, window must be owned by the same thread.<br></div><div class="gmail_extra">B) SetTimer(HWND, Timeout); GetMessage(HWND); KillTimer; // use blocking GetMessage, unblock it via WM_TIMER.<br></div><div class="gmail_extra"><br></div><div class="gmail_extra">I found some other oddities but not ready to formalize them yet, I'll keep experimenting.</div><div class="gmail_extra"><br></div><div class="gmail_extra">Denis</div><div class="gmail_extra"><br></div></div>