您在執行密集的 OLE 自動化,很有可能是在一個迴圈中執行,採用的是無使用者干預模式。此時會收到以下錯誤訊息:
The remote procedure call failed.
原因
使用 COM 或 OLE 的每個執行緒必須分別呼叫 CoInitialize() 或 OleInitialize()。在執行此呼叫時,作業系統將建立一個隱藏的頂層視窗,此視窗歸您的執行緒所有,用於執行實施。由於作業系統依賴於後臺的 Windows 訊息處理,因此您的執行緒應該(在某些情況下必須)抽取訊息。如果未能抽取訊息,會導致自動化錯誤,有時,當其他應用程式向所有頂層視窗廣播訊息時將會出現死鎖情況(例如,一個應用程式可能會廣播 WM_WININICHANGE 或 WM_SETTINGCHANGE 訊息,通知其他應用程式預設印表機已更改)。
解決方案
如果迴圈使用 OLE 自動化(例如,將 10,000 行資料寫入 Microsoft Excel),則需要在迴圈內使用 PeekMessage() 迴圈,以便訊息得到處理。
您在執行密集的 OLE 自動化,很有可能是在一個迴圈中執行,採用的是無使用者干預模式。此時會收到以下錯誤訊息:
The remote procedure call failed.
原因
使用 COM 或 OLE 的每個執行緒必須分別呼叫 CoInitialize() 或 OleInitialize()。在執行此呼叫時,作業系統將建立一個隱藏的頂層視窗,此視窗歸您的執行緒所有,用於執行實施。由於作業系統依賴於後臺的 Windows 訊息處理,因此您的執行緒應該(在某些情況下必須)抽取訊息。如果未能抽取訊息,會導致自動化錯誤,有時,當其他應用程式向所有頂層視窗廣播訊息時將會出現死鎖情況(例如,一個應用程式可能會廣播 WM_WININICHANGE 或 WM_SETTINGCHANGE 訊息,通知其他應用程式預設印表機已更改)。
解決方案
如果迴圈使用 OLE 自動化(例如,將 10,000 行資料寫入 Microsoft Excel),則需要在迴圈內使用 PeekMessage() 迴圈,以便訊息得到處理。