Delphi Windows 2008和错误的BPL加载

Delphi Windows 2008和错误的BPL加载,delphi,windows-server-2008-r2,runtime-packages,Delphi,Windows Server 2008 R2,Runtime Packages,我有一个用运行时包构建的应用程序。当可执行文件启动时,它会自动加载所需的包(.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所依赖的运行时包 问题是:

我有一个用运行时包构建的应用程序。当可执行文件启动时,它会自动加载所需的包(.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\u 2\app.exe”
,它加载
“c:\app\version\u 2\common.bpl”
。 当我启动
“c:\app\version\u 1\app.exe”
时,它加载了错误的bpl(来自version\u 2)

路径
“c:\app\version\u 2\”
不在系统搜索路径中

在Windows2003服务器上,此问题不会发生

我能做些什么来解决这个问题

谢谢


我已经下载了ProcessExplorer(MicrosoftSysinternals),并检查了每个可执行文件的加载模块,它们都是正确的

但我注意到另一个问题。在启动第二个版本后,发生entry not found(条目未找到)错误,告诉我找不到某个单元的初始化入口点(仅存在于其中一个版本中)

有些事情很奇怪。ProcessExplorer告诉我进程正在加载正确的modole,但是当它们运行时,这似乎没有发生

应用程序似乎正在共享加载的模块


已解决

有一个使用FindVCLWindow的鼠标簿,它正在生成AV


抱歉给大家带来不便,谢谢

如果BPL静态链接到EXE,并且当运行
version_1
EXE时
version_2
BPL已经在内存中,Windows将重新使用内存中现有的BPL,它将不会重新加载另一个BPL的新副本。这是:

如果lpFileName不包含路径,并且有多个加载的模块具有相同的基名称和扩展名,则函数将返回首先加载的模块的句柄

当使用静态链接时,没有路径信息,因此操作系统加载程序必须自行关闭文件名

要执行您正在尝试的操作,您需要为每个EXE创建一个.local文件,将它们彼此隔离,以便它们可以并行加载各自的DLL


很难想象与可执行文件位于同一文件夹中的文件是如何被过度查看的您确定这不是Windows终端服务中接管的另一个文件虚拟化功能吗?换句话说,你认为正在发生的事情不是正在发生的事情。当然,从版本2中删除BPL,看看它是否仍然错误。如果是这样的话,那么您的路径中的某个其他目录中就有该DLL的另一个缓存/虚拟化副本。@David-当您没有指定完整的DLL路径名时,这对于Windows来说是一个糟糕但标准的选择。就像Excel无法从不同文件夹打开相同的命名文件一样,创建清单资源。使用web来确定它应该包含哪些内容。用brcc32编译它。并将其与$R链接。我认为要避免虚拟化,您需要做的是使用PE标志。检查这个链接:你完全搞错了。这里有两个不同的过程。MSDN链接指的是调用过程中加载的模块。过程是孤立的。一个进程加载的模块不能影响另一个进程加载的模块。如果这是真的,想象一下这场浩劫。我创建了一个名为user32.dll的模块,没有导出,然后将其加载到进程中。现在,下一个进程开始时会发生什么?@David
LoadModule
在这里是不相关的,没错。这是PE加载程序的行为,通过尽可能不复制页面而共享页面来节省虚拟内存。它用于DLL注入。关于PE loader的信息很少,在一些古老的博客上也有一些文章。但类似的行为以前也见过。我想知道他是否可以包括精心编制的清单,并使用WinSxS解决这个问题…@Arioch我不知道你在说什么。没有一个我没有谈到LoadModule,甚至不知道它是什么。@Arioch'您指的是16位
LoadModule
API吗?我把
LoadLibrary
命名错了。我记得已经加载的同名DLL至少在静态DLL链接方面有问题,尽管我不知道我现在记不起细节了