LoadLibrary不重用加载的库

我的目录结构如下:

test dir a.dll <-- version 1 a.dll <-- version 2 myapp.exe 

我希望LoadLibrary("dir\\a.dll")使用版本1,而LoadLibrary("a.dll")将使用版本2,同时:

 LoadLibrary("dir\\a.dll"); LoadLibrary("a.dll"); 

根据LoadLibrary的文档,两者都将引用版本1。

但是,当我尝试在应用程序中这样做时, 第1行加载版本1,第2行加载第2版。

我试图写一个小的复制器,但在复制器中按预期工作 – 所以有一些在较大的应用程序或在加载的DLL中打破。 有什么可以导致的,我该如何解决呢?

而要强调的是,这两个负载在较大的应用程序中是相邻的,在第1行和第2行之间没有系统调用(当然也是相同的过程)。 我原本想在它们之间插入很多代码,但是看到这个问题,甚至在它们相邻的时候也转载了它。

我也尝试了以下的目录结构:

 test dir a.dll <-- version 1 myapp.exe Windows System32 a.dll <-- version 2 

但是,第1行加载版本1,第2行加载版本2。

我设法找到解决方案。 实际上,这只需要一些思考 – 回想起来很明显:当我的第一个LoadLibrary调用之前,dll已经被加载了,就会出现这种情况。 所以第一个调用,显式路径,加载版本1 – 而第二个调用,没有路径,默认第一个加载的DLL(根据文档),恰好是版本2。

这可以通过在第一次LoadLibrary调用之前强制卸载库来解决:

 HMODULE alreadyLoaded = GetmoduleeHandle("a.dll"); if (alreadyLoaded) { FreeLibrary(alreadyLoaded); } 

虽然这对我来说已经足够了,但更完整的解决方案是在一个循环中这样做,以处理多次加载dll的情况:

 HMODULE alreadyLoaded = GetmoduleeHandle("a.dll"); while (alreadyLoaded) { FreeLibrary(alreadyLoaded); alreadyLoaded = GetmoduleeHandle("a.dll"); } 

当然,这是潜在的危险 – 特别是如果原始HMODULE存储在某个地方,因为这使得它无效。