2012-10-10 55 views
1

我有一個使用運行時軟件包建立的應用程序。當可執行文件啓動時,會自動加載所需的軟件包(.bpl)。Windows 2008和錯誤的BPL加載

最近我們安裝了Windows 2008 R2服務器作爲終端服務使用。

我們維持在不同的路徑我們的應用程序的一些老編譯的版本,像這樣:

c:\app\version_1\common.bpl 
c:\app\version_1\app.exe 

c:\app\version_2\common.bpl 
c:\app\version_2\app.exe 

Common.bpl是一個運行包什麼APP.EXE依賴。

問題:

我開始"c:\app\version_2\app.exe"和它加載"c:\app\version_2\common.bpl"。 當我啓動"c:\app\version_1\app.exe"時,它會加載WRONG bpl(從version_2開始)。

路徑"c:\app\version_2\"不在系統搜索路徑中。

在Windows2003服務器上不會發生此問題。

我能做些什麼來解決這個問題?

謝謝!


我已經下載了進程資源管理器(微軟Sysinternals的),並檢查每個可執行文件的加載的模塊,所有這些都是正確的!

但我注意到另一個問題。在啓動第二個版本之後,發生了一個entry-not-found-error錯誤,告訴我什麼只有一個版本中存在的單元的初始化入口點無法找到。

東西很奇怪。 ProcessExplorer告訴我該進程正在加載正確的modoles,但是當它們運行時,這似乎不會發生。

似乎應用程序正在共享加載的模塊。


解決

有一個MouseHook使用FindVCLWindow,這是生成AV。

抱歉給不方便的人們,謝謝!

+0

很難想象如何在同一個文件夾中的文件可執行過來看了 –

+1

你確定這不是在Windows終端服務的另一個文件的虛擬化功能接管?換句話說,你認爲發生的並不是發生的事情。可以肯定的是,從version_2中刪除BPL,看看它是否仍然是錯誤的。如果是這樣,那麼你的路徑中某個OTHER目錄中的某個位置有另一個緩存/虛擬化的DLL副本。 –

+0

@David - 當你沒有指定完整的DLL路徑名時,這是對Windows而言很差但標準的選擇。就像Excel無法打開來自不同文件夾的同名文件一樣 –

回答

2

如果BPLs靜態鏈接到EXE文件,如果在運行version_1 EXE當version_2 BPL已在內存中,Windows會在內存中重新使用現有的BPL,也不會重新裝入一個新副本的其他BPL。這是documented behavior

如果lpFileName的對象不包括路徑和存在具有相同基名和擴展名以上的加載模塊,該函數返回的句柄是第一次加載模塊。

使用靜態鏈接時,沒有路徑信息,所以OS加載程序必須自行脫離文件名。

要做你正在嘗試的,你需要爲每個EXE創建一個.local文件來隔離它們,以便它們可以並行加載它們各自的DLL。

DLL/COM Redirection on Windows

Dynamic-Link Library Redirection

+1

你有這個錯誤。這裏有兩個截然不同的過程。 MSDN鏈接指的是在調用過程中加載的模塊。流程是孤立的。一個進程加載的模塊不能影響哪個模塊被另一個進程加載。想象一下,如果那是真的,那就是浩劫。我創建了一個名爲user32.dll的模塊,但沒有導出,然後將其加載到我的進程中。現在,當下一個過程開始時會發生什麼? –

+0

@David'LoadModule'在這裏是不相關的,是真的。這是PE加載程序的行爲,通過不復制頁面來保存虛擬內存,如果可能的話,但共享它們。它被用於DLL注入。有關PE加載器的信息很少,一些古代博客中的一些文章等。但之前看到過類似的行爲。我想知道他是否可以包含特製的清單並使用WinSxS來解決這個問題... –

+0

@Arioch我不知道你在說什麼。沒有。我沒有談論LoadModule,甚至不知道它是什麼。 –

相關問題