我有一个用运行时包构建的应用程序。当可执行文件启动时,它会自动加载所需的包(.bpl)。
最近,我们安装了一个Windows2008 R2服务器作为终端服务。
我们在不同的路径中维护应用程序的一些旧编译版本,如下所示:
c:\app\version_1\common.bpl
c:\app\version_1\app.exe
c:\app\version_2\common.bpl
c:\app\version_2\app.exeCommon.bpl是app.exe所依赖的运行时包。
问题是:
我启动"c:\app\version_2\app.exe",它加载"c:\app\version_2\common.bpl"。当我启动"c:\app\version_1\app.exe"时,它加载错误的bpl (从version_2)。
路径"c:\app\version_2\"不在系统搜索路径上。
在Windows2003服务器上,这个问题不会发生。
我能做些什么来解决这个问题?
谢谢!
我已经下载了Process (microsoft ),并检查了每个可执行文件的加载模块,它们都是正确的!
但我注意到了另一个问题。启动第二个版本后,会出现一个条目--没有找到--错误,告诉我无法找到一个只存在于其中一个版本中的单元的初始化入口点。
有些事很奇怪。ProcessExplorer告诉我进程正在加载正确的modoles,但是当它们运行时,这种情况似乎不会发生。
似乎应用程序正在共享加载的模块。
解决了
有一个使用MouseHook的FindVCLWindow,这就产生了AV。
很抱歉给大家带来不便,谢谢!
发布于 2012-10-10 21:59:49
如果BPLs静态地链接到EXE,如果运行version_2 EXE时version_1 BPL已经在内存中,则version_1将重用内存中现有的BPL,它将不会重新加载另一个BPL的新副本。我是有记录的行为
如果lpFileName不包括路径,并且有多个加载模块,具有相同的基本名称和扩展名,则函数将返回首先加载的模块的句柄。
当使用静态链接时,没有路径信息,因此OS加载程序必须自己离开文件名。
要执行您正在尝试的操作,您需要为每个EXE创建一个.local文件来将它们彼此隔离,以便它们可以并行地加载各自的DLL。
Windows下的DLL/COM重定向
动态链接库重定向
https://stackoverflow.com/questions/12828068
复制相似问题