當我的插件DLL加載到主機應用程序的地址空間中時,我需要將一些數據寫入文件。問題是,在那個時間點該文件已經通過獨佔寫訪問的主機進程打開了,我到CreateFile
調用失敗ERROR_SHARING_VIOLATION
在Windows DLL中,如何獲取當前進程已打開的文件句柄?
我不知道,我可以用某種方式獲取宿主進程的文件句柄WinAPI呼叫?這看起來像一個可怕的想法,但我真的需要寫入該文件。有人對如何解決這個問題有什麼好的想法嗎?
當我的插件DLL加載到主機應用程序的地址空間中時,我需要將一些數據寫入文件。問題是,在那個時間點該文件已經通過獨佔寫訪問的主機進程打開了,我到CreateFile
調用失敗ERROR_SHARING_VIOLATION
在Windows DLL中,如何獲取當前進程已打開的文件句柄?
我不知道,我可以用某種方式獲取宿主進程的文件句柄WinAPI呼叫?這看起來像一個可怕的想法,但我真的需要寫入該文件。有人對如何解決這個問題有什麼好的想法嗎?
打開的句柄可以通過NtQueryInformationProcess
和/或NtQuerySystemInformation
進行枚舉,但它並未官方支持(您可以在Google上找到非Microsoft文檔),並且可能無法在將來的Windows版本中使用。
謝謝。這看起來很複雜,但我會試一試 – Gart
這是一個文件,主機應用程序的用戶可以關閉,然後在插件完成工作後重新打開?無論如何,主機是什麼樣的應用程序?主機應用程序可能提供插件寫入主機打開的文件的方法,具體取決於主機應用程序的內容。 – JAB
@JAB:應用程序是一個非常特定的圖像查看器,我試圖打開的文件是一個包含圖像元數據的文本文件。它與圖像一起出現。不幸的是,主機應用程序不提供API來修改此文件。 – Gart
即使您可以獲得句柄,也幾乎可以保證打破/混淆主機進程。數據不會是它期望的,目前的文件位置將是錯誤的。 – Deanna