微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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版。

在8秒内检测16 GB笔式驱动器上的内容更改

调用clock_gettime()可能返回的tv_nsec字段实际上超过了一秒?

使用Rock Ridge扩展将文件添加到ISO

确定一个COM是一个In-Proc还是一个LocalServer

我怎样才能使Unicode iostream I / O在Windows和Unix的土地上工作?

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

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

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

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

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

更改保存button上的认文本

如何从Windows中提取Windows OEM密钥

分叉()并运行在特定的一组cpu

C ++符号在共享对象中具有不同的大小

Visual C ++不会创build该dll文件并停止在* .lib

我设法找到解决方案。 实际上,这只需要一些思考 – 回想起来很明显:当我的第一个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存储在某个地方,因为这使得它无效。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐