這兩天一直在用COM裡的復合文檔來做個東東。我通過C#的平台調用方法使用IStorage和IStream這些接口的,並寫了一個流類來包裝IStream。在“調試”模式下,運行得很好,但是在“Release”下,則報錯了!
症狀為:
在長時間讀寫一個復合文檔時,開始是可以正常運行的,但是一段時間後,就會報錯
說“試圖使用一個不存在的對象異常來自HRESULT 0x800030100 STG_E_REVERTED ” 。
而且問題是在Debug模式下,根本不出現這個問題,問題只出現在Release模式下。
開始我以為是和COM平台調用時的問題,看遍了MSDN和Google上能找到的相關資料,都沒有提到類似的錯誤。沒辦法,我只能一段代碼一段代碼來查找原因。考慮到錯誤是引用了一個不存在COM對象,那麼有可能是COM中對象計數器的問題,我想是不是什麼的代碼導致釋放了引用COM對象的變量。
整整花了近六個小時,我才發現我犯了一個基本錯誤。我在包裝類裡寫一個析構函數
~StorageStream()
{
this.Dispose();
}
而我的主程序源代碼比較長,不貼出來了,大概如下面代碼
1 Storage storage = Storage.CreateStorageFile(...);