2012-03-06 75 views
2

對話框我有MFC應用程序彈出一個服務器忙dilaog,看上去就像這裏: https://stackoverflow.com/questions/4968872/how-can-i-disable-the-ole-server-busy-dialog-in-a-c-sharp-appCOM「服務器忙」的MFC

該應用程序調用AfxOleInit()。 http://support.microsoft.com/kb/248019解釋說我應該做 AfxOleGetMessageFilter() - > SetMessagePendingDelay(nTimeout); 以避免出現對話框。它還建議我使用OleInitialize而不是AfxOleInit來禁止對話。

這是否意味着,如果我不叫AfxOleInit(),然後我就不會得到服務器忙對話框? 我無法真正測試,因爲沒有AfxOleInit(),AfxOleGetMessageFilter返回空指針,所以我不能真正將其設置爲1ms,並測試它是否會在超時時彈出對話框。

所以我的問題是,如果我不叫AfxOleInit然後我會永遠得到「服務器忙」對話框?

感謝

+0

不要遷怒於送信。你的UI線程永遠不應該運行代碼超過幾秒鐘,並且不應該阻塞。使用線程執行緩慢的操作,讓您的UI響應用戶輸入。使對話消失。 – 2012-03-06 13:20:11

回答

1

看,調用AfxOleInit不漂亮一樣「OleInitialize」,這在內部調用「CoInitialize」。

它初始化COM環境,所以,你可以使用OLE自動化,豐富OLE容器,ActiveX控件和e.t.c.但額外性,它會安裝一個消息過濾器,然後您可以使用AfxOleGetMessageFilter()獲取。此消息過濾器專門用於處理情況,因爲OLE請求阻止UI時間過長。

因此,如果您調用OleInitialize而不是'AfxOleInit',則不會安裝消息過濾器,因此您將看不到「服務器正忙」對話框,並且AfxOleGetMessageFilter()將指向NULL。

而且在文章中建議,你可以使用

AfxOleInit() 
.... 
AfxOleGetMessageFilter()->EnableNotRespondingDialog(FALSE); 

禁用此對話框。

但是你最好的選擇是要找到潛在的問題。