An error message occurs when you are performing intensive OLE Automation in a loop in Visual C++: “The remote procedure call failed”

You are performing intensive OLE Automation, most likely in a loop without user intervention, and receive the following error message:

The remote procedure call failed.

CAUSE

Every thread that uses COM or OLE must call the CoInitialize function or the OleInitialize function, respectively. When this call is made, the OS creates a hidden top-level window, owned by your thread, for implementation purposes. Because the OS relies on Windows messaging behind-the-scenes, your thread should, and in some cases MUST, pump messages. Failure to do so can result in automation errors, and sometimes in a deadlock situation when another application broadcasts a message to all top-level windows (for example, an application might broadcast a WM_WININICHANGE or WM_SETTINGCHANGE message to notify other applications the default printer has changed).

RESOLUTION

If you are using OLE Automation in a loop (for example, writing out 10,000 rows of data to Microsoft Excel), you need a PeekMessage loop inside your loop so that messages will get processed.

STATUS

This behavior is by design.

MORE INFORMATION

Here is an example of a PeekMessage loop you can use in your code.

MSG msg;
   while(PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE)) {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

AddThis Social Bookmark Button

Leave a Reply

*
To prove that you're not a bot, enter this code
Anti-Spam Image