2013-03-26 72 views
0

我一直在爲我的項目廣泛使用ESENT,我真的很喜歡它的工作原理。而且太穩定了!在Delphi項目中發生Windows 8崩潰問題

但是我有一個Windows 8的巨大問題!無論我何時調用除JetSetSystemParameter之外的其他東西,我都會鏈接到esent.dll(動態或靜態),這個dll會崩潰,將我的應用程序下載到懸崖上。

不幸的是,我仍然無法運行它。我的代碼在Windows 7或更舊版本上運行時沒有問題。但是對於Windows 8,當我嘗試創建一個實例(浮點無效操作)時,esent.dll崩潰。

我嘗試了所有可能的調用約定。這絕對不是問題。我試了一些,發現了這個奇怪的情況:1.我使用VS 2012創建了一個演示應用程序,JetCreateInstance工作得很好。 2.在Delphi XE3中完全相同的代碼會發送esent.dll崩潰。 3.我使用VS 2012創建了一個DLL,導出了在上述演示應用程序中完美工作的方法,認爲這是一個Delphi錯誤。 4.然後我在一個演示的Delphi項目中加載DLL(用6,XE2和XE3嘗試)。稱爲方法和BOOM。同樣的崩潰。

現在我的假設是,微軟不會允許?!?任何其他開發人員的環境與esent.dll正常工作。 這可能嗎?

+1

它可能是Delphi的FPU設置。你有沒有試圖改變這一點? – jachguate 2013-03-26 12:41:44

+0

Duplicate:http://stackoverflow.com/questions/13415275/esent-crashes-with-windows-8 – bummi 2013-03-26 12:46:07

+0

關閉另一個會更好。由於它給予了編程環境,因此這是一個更好的問題,並且可以更好地診斷異常。 – 2013-03-26 12:49:09

回答

5

該錯誤是一個浮點無效操作,使問題聽起來好像與浮點控制字相關。

默認情況下,Delphi不會屏蔽浮點異常。所以當代碼要求浮點單元執行導致錯誤的操作時,FPU信號會被轉換爲異常。

但是大多數其他Windows開發環境在FPU上掩蓋了這些異常。這樣的代碼是在假設執行環境具有掩碼的FPU異常的情況下編寫的。但是如果你從Delphi調用一個DLL,那麼執行環境將會有非屏蔽的FPU異常,從而打破了這個假設。我懷疑,如果你掩蓋FPU異常,那麼你的問題就會消失。

爲了測試是否是這個問題,你可以簡單地添加到您的代碼,早在其生命中執行:

Set8087CW($027F); 

這將屏蔽所有異常和FPU控制字設置爲默認的Windows設置。

從長遠來看,您可能希望在每次調用此DLL之前屏蔽異常,然後在對DLL的調用返回時恢復FPU控制字。

這是一個使用Delphi提供的庫的稍微危險的遊戲,因爲Set8087CW由於使用全局變量Default8087CW而不是線程安全的。如果你想閱讀更多關於這個問題的信息,我可以參考QC#107411