如何通过env-variable设置依赖于某些第三方dll的dll的加载?

时间:2019-07-04 11:20:41

标签: c++ dll

例如:我有C:\ test \ foo.exe,它需要我的bar.dll(假设baz.dll不是标准的Windows共享组件,它又需要baz.dll),然后我将两个bar C:\ test对话框中的.dll和baz.dll,一切正常。

但是我希望所有内容都在其位置上,所以我想避免将所有相关dll都复制到与C:\ test \ foo.exe相同的文件夹中的过程。例如。我想设置一些env变量,该变量将存储指向baz.dll所在目录的路径,然后使用它来加载库。

有可能吗?怎么做到呢?您如何处理这种情况?

1 个答案:

答案 0 :(得分:0)

这取决于您的应用程序如何链接。我假设像大多数现代应用程序一样,您正在使用创建清单的清单创建它,该清单创建了加载上下文。如果没有,则将在%PATH%上找到DLL,因此您可以使用它。但是,如果您使用的是清单,请继续阅读:

在大多数情况下,要在任意位置查找DLL,必须使用LoadLibrary动态加载依赖项;参见https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-loadlibrarya

更长的答案:没有内置的方法可以做到这一点。这将是一个安全漏洞,因为它将使攻击者可以用自己的DLL替换DLL。但是,假设您的应用程序与此无关,则可以使用LoadLibrary加载bar.dll(使用您喜欢的任何方法查找它);您必须用在运行时使用GetProcAddresshttps://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-getprocaddress)解析的函数指针来替换对该DLL中所有函数的调用。

现在关于二级依赖项baz.dll,我认为,如果先用LoadLibrary加载它,然后再加载bar.dll时,它将解决已经存在的依赖项。加载的baz.dll。

如果您真的想变得复杂,可以将依赖的DLL包装在程序集中;我相信程序集本身可以指定路径。但是,这变得非常毛茸茸。