我的目录结构如下:
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存储在某个地方,因为这使得它无效。
总结以上是内存溢出为你收集整理的LoadLibrary不重用加载的库全部内容,希望文章能够帮你解决LoadLibrary不重用加载的库所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)