很久以前,我發現由於使用了Delphi打開文件和/或保存文件對話框(它封裝了Windows對話框),我在代碼中訪問衝突。我在幾個論壇上提出了一些問題,並被告知可能是由於某些程序向shell系統添加鉤子導致每個進程注入DLL的方式,其中一些可能會導致程序混亂。爲了記錄,我使用的編程環境是在Windows XP 32位上運行的Delphi 6 Professional。當使用Windows文件對話框時,在奇怪位置訪問衝突
當時我沒有使用Delphi的Dialog組件,而是直接調用comdlg32.dll。這很好地解決了這個問題。
今天我第一次使用內存映射文件,當然,訪問衝突開始出現在代碼的怪異部分。我嘗試了我的comdlg32.dll直接調用,這次它沒有幫助。爲了將問題隔離爲測試,我創建了一個列表框,其中包含我在測試期間使用的完全相同的文件。這些是我從「打開文件」對話框中選擇的完全相同的測試文件,然後使用啓動我的內存映射文件。我設置了一些東西,通過單擊列表框中的文件,我將在我的內存映射文件測試中使用該文件,而不是調用comdlg32.dll對話框函數來選擇測試文件。
同樣,訪問violatons消失。爲了向您展示它是如何引人注目的解決方案,我從1到3次試用中遇到了訪問衝突,而沒有任何衝突。不幸的是,當然當我需要使用文件對話框時,它會咬我。
有沒有其他人處理過這個問題,並發現真正的罪魁禍首?你們有沒有找到我可以用來解決這個問題的解決方案,而不是像我現在一樣圍繞它跳舞?
在此先感謝。
你需要得到在碰撞發生堆棧。使用NTSD並設置公共符號。 http://msdn.microsoft.com/en-us/library/cc266473.aspx – 2010-03-17 22:15:17
我從來沒有見過這個問題,但有一點,如果你對Delphi 6的可能(或許)幫助與更換內存管理器FastMM4,比舊版本更穩定。 – 2010-03-17 22:24:21
你好梅森。我正在使用FastMM4,我對每個詳細檢查都進行了幾次測試,特別是檢查堆損壞情況。它沒有找到任何東西。在我的程序中移動內存指令期間發生崩潰,就像很久以前一樣。這是因爲如果某些DLL寫了我的記憶中或可變控制存儲器移動的範圍的塊,但並沒有做到這一點的方式,錯位任何FastMM4的內存塊頭。但這是我的猜測,因爲我不知道根本原因。 – 2010-03-17 23:05:42