LoadLibrary不重用加载的库

LoadLibrary不重用加载的库,第1张

概述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存储在某个地方,因为这使得它无效。

总结

以上是内存溢出为你收集整理的LoadLibrary不重用加载的库全部内容,希望文章能够帮你解决LoadLibrary不重用加载的库所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1247009.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存