Shell命名空間擴展非常複雜。過去10年來,我們一直在構建shell命名空間擴展;其最新版本是MagicRAR中的檔案文件夾功能(www.magicrar.com)。Delphi中使用VCL的Shell命名空間擴展
不幸的是,儘管非常仔細的編碼,確保線程能夠正確訪問共享內存等,但我們的shell命名空間擴展仍然偶爾發生崩潰。 Explorer主機進程在使用我們的shell命名空間擴展期間或之外崩潰。
我們使用了各種工具,例如AQTime Pro來排除我們的shell命名空間擴展代碼。沒有內存覆蓋或其他類似的訪問問題報告。這隻剩下一個罪魁禍首:VCL不是線程安全的!
確實,我們使用VCL作爲shell命名空間擴展的一部分;資源管理器中的文件列表實際上是一個託管控件,在我們自己的shell命名空間擴展的情況下,它實際上是一個VCL窗口。我們現在甚至想知道(在多代開發之後)這是否是首先允許的場景...
主要應用程序對象甚至不存在於我們的shell命名空間擴展DLL中。使用TThread.Synchronize死鎖資源管理器,因爲主要的VCL線程還沒有創建任何地方。我們是否需要手動創建主VCL線程(如何?) - 可能在另一個DLL中 - 並通過該DLL重新路由所有UI創建/更新/銷燬?請記住,資源管理器可能會顯示包含我們的VCL窗口的任意數量的窗口。基於目標系統的配置,Explorer也可能作爲多個獨立進程運行,或作爲單個進程運行。
我們在John Lam的出發點(就像大多數Delphi shell命名空間開發人員所知道的那樣)基於shell命名空間擴展。當然,正如你在最終產品中看到的那樣,對這個起點進行了重大修改。 John Lam從來沒有在他的幻燈片和示例項目中討論過VCL是否是線程不安全的問題。
我們也試圖在過去的十年中使用多個版本的ShellPlus組件。他們已經完成了一些出色的工作,但不幸的是,根據我們的經驗,即使是基於代碼的非常基礎的努力,也提供了比我們自己的代碼更糟糕的結果。
ShellPlus實際上還提供了使用Explorer自己的預定義主機窗口的功能,而不是創建自定義的VCL窗口;雖然這可能會迴避任何VCL線程問題,但根據我們的經驗,這還不是一個可行的解決方案 - 因爲ShellPlus shell命名空間擴展一直不如我們的家庭釀造代碼穩定,無論是否加入VCL。
所以首先,這個問題是理論上的問題 - VCL是否可以用在使用Explorer內部的VCL窗口作爲進程主機的shell命名空間擴展中?
如果是這樣,在這種情況下如何處理VCL線程安全問題?
您是否真的檢查過觸摸GUI的代碼是否在每個進程的多個線程中運行? Win32有它自己的線程規則。具體而言,窗口具有線程關聯。我期望任何時候瀏覽器都希望你使用窗口句柄,你總是會在同一個線程中調用。換句話說,我質疑線程關聯是否實際上是您的問題。 – 2013-02-28 10:15:48
如果資源管理器非常關注線程關聯性,那麼這很好,但是當多個資源管理器窗口顯示其中的多個VCL窗口副本時會發生什麼? VCL不是線程安全的,因此在同一進程內部仍然會有多個線程在執行GUI工作 - 而不是單個線程處理所有GUI工作。確實,Explorer創建了多個調用shell命名空間擴展的線程。 – user2118012 2013-02-28 12:17:40
好的,在這一點上,你被洗淨了。 – 2013-02-28 13:24:15