我的目录结构如下:
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字段实际上超过了一秒?
确定一个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] 举报,一经查实,本站将立刻删除。