【发布时间】:2011-09-14 16:14:44
【问题描述】:
我有一个第三方 DLL,它依赖于 MSVCR80 并分配了我需要清理的资源。该库确实不公开了一个free-函数来执行此操作。相反,我需要加载相同的运行时库并手动调用free 函数。
作为一种解决方法,我正在尝试编写一个“包装器”DLL,以加载正确的运行时并公开free 函数。此 DLL 是使用 Visual Studio 2010 创建的,并且依赖于单独的运行时库。执行 LoadLibrary("msvcr80.dll") 失败并出现错误 R6034,我猜这是因为清单问题。
甚至可以使用LoadLibrary 加载 msvcr80.dll 吗?我是否需要创建一个清单,将其嵌入到 DLL 中并将 msvcr80.dll 存储在与我的包装 DLL 相同的目录中?
我意识到这是第三方库中的一个缺陷,但我几乎被这个版本所困扰。让供应商解决这个问题很可能不是一种选择。
【问题讨论】:
-
将激活上下文 api 与恶意 dll 使用的相同清单资源一起使用。这将使 LoadLibray 调用工作。
-
您需要 GetModuleHandle() 代替,因为 DLL 已经加载。然后GetProcAddress()获取_free函数的地址。
-
@hans 问题是传递什么作为模块名称。这就是可爱的 SxS 东西。请参阅上一个问题。
-
@David - 只有 SxS 目录名称很复杂,这是 LoadLibrary 的问题。不适用于 GetModuleHandle,模块名称只是“msvcr80”。
标签: c++ winapi dll manifest msvcrt