ID Number: Q83021
3.00 3.10
WINDOWS
Summary:
Windows implements object linking and embedding (OLE) through dynamic
data exchange (DDE); the OLE libraries send and post DDE messages to
transmit information. Because DDE messages must be processed in a
particular order, an OLE server application must not enter a message
dispatch loop in an OLESERVER, OLESERVERDOC, or OLEOBJECT method.
More Information:
When an application displays a message box or a modal dialog box,
Windows enters a message dispatch loop. If such a loop occurs within
an OLE method, it could allow the OLE libraries to receive additional
DDE messages before the current method completed processing. These
messages could cause problems; the OLE libraries might act as if the
method in progress (that started the message dispatch loop) had
completed its processing, and call another method. If this new method
requires information provided by the incomplete method, an error will
result.
To avoid this situation, the OLE Server Library provides the
OleBlockServer function. When a server application blocks itself by
calling this function, the OLE libraries queue all incoming requests
to the server. When the server is ready to continue processing, it
calls the OleUnblockServer function to unblock itself. A server
application generally blocks during a lengthy operation where an
interruption to processing will be difficult or impossible to handle.
Additionally, a server should block itself any time it displays a
dialog box or a message box.
The following code demonstrates blocking an OLE server during the
OLESERVER::Create method:
BOOL fBlocked = FALSE; // Global flag to indicate server blocked.
OLESTATUS FAR PASCAL ServerCreate(...)
{
// The value of lhServer identifies the server and is provided by a
// call to the OleRegisterServer function.
retVal = OleBlockServer(lhServer);
// Set the flag indicating server blocked.
fBlocked = TRUE;
if (retVal == OLE_OK)
MessageBox(...);
else
return(OLE_ERROR_GENERIC);
}
.
. // Other code.
.
// Main message loop in WinMain.
while (TRUE)
{
// Loop until no more blocked OLE requests.
while (fBlocked)
OleUnblockServer(lhServer, &fBlocked);
GetMessage(&msg, NULL, 0, 0)
// WM_QUIT message received, fall out of loop.
if (msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Please note that OleUnblockServer unblocks only one request at a time.
Therefore, it is necessary to call this function repeatedly until all
requests have been unblocked.
Additional reference words: 3.10