加载2个名称相同但内容不同的DLL

时间:2019-07-04 09:03:20

标签: c++ windows oracle dll

我有一个内置于excel插件的Windows C++应用程序。我的应用程序通过OCCI (https://www.oracle.com/database/technologies/appdev/oci.html链接到oracle 12客户端。

在运行时,程序将延迟加载Oracle dll’s,例如ocil.dll, oraons.dll, OraOCIEI12.dll. 请注意,由于dll存储在文件服务器上(未在用户的Windows PATH变量中设置),因此dll设置为延迟加载,程序要做的第一件事就是设置此位置。

我们有一些用户将我们的excel插件与自己的使用VBA的{​​{1}}代码结合在一起。问题是我们的用户均未在自己的计算机上安装oracle ODBC driver。它们改为运行oracle 11客户端,并且不允许升级。

Oracle名称中没有版本依赖性; oracle 11和12客户端都依赖于oracle 12 client,依此类推。dll依赖于版本,它们的名称不依赖于。

崩溃有两种:

  1. 首先,用户通过我们的库调用某些内容,然后通过外部VBA代码进行调用。发生的情况是,首先加载了oracle 12 dll。我们的库运行良好,但是由于它试图使用oracle 12库,因此VBA代码崩溃。
  2. 首先,用户调用VBA代码,然后调用我们的库。 VBA代码可以加载oracle 11 dll并可以正常运行,但是我们的库崩溃了。

我们的应用程序链接到从以下位置下载的SDK库: https://www.oracle.com/technetwork/topics/winsoft-085727.html (instantclient-sdk-nt-12.2.0.1.0.zip) 由于我们使用Visual Studio 2017和MSCV 14.14编译器进行编译,因此我们的应用程序必须链接到oracle 12。

我可以以某种方式使其同时加载两个oracle客户端吗?

我查看了oracle头文件,其中没有任何文件指定需要加载的dll的名称。我们的应用程序链接到oci.dll, oraons.dll,在那里我可以看到oci.lib的多次出现。也许我可以用“OCI.dll”代替它们?

我也找到了此页面:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/b3eaa07f-7f92-4693-8aa1-b8fee0b92d2f/cannot-load-2-dlls-with-same-name-but-different-versions

我尝试过。当我做一个明确的“OCI12.dll”时,我可以在调试器中看到我正在加载用清单设置的那个。但是,当我随后进行使用oracle的实际函数调用时,它正在加载OCI.dll(在我们的文件服务器上),并与其他3个oracle dll一起加载:LoadLibraryA("oci.dll")。也许这与oracle如何加载dll有关?

为完整起见,用户在其VBA代码中执行以下操作:

oraocci12d.dll, OraOCIEi12,dll and oraons.dll

先谢谢了。 内尔

0 个答案:

没有答案