使用外部(非项目)dll的本机VC++参考如何指定dll的路径

Native VC++ using external (not project) dll reference how to specify path to dll

本文关键字:dll 参考 VC++ 何指定 路径 本机 项目 外部      更新时间:2023-10-16

我有一个使用dll(不在项目中)的本地VC++项目。现在,我必须把dll放在"Windows用来定位dll的搜索路径"中链路

但我不希望dll位于可执行目录、当前目录、windows目录或系统目录中。

因此,我唯一的选择是将路径添加到%path%环境变量中。

还有别的办法吗?

有没有一种优雅的方法(添加到PATH)?我应该在安装时这样做吗?如果我这样做,我应该担心吗?

总结我发现的所有技术:

  • 如果您使用托管项目作为启动项目(实际上是我的情况)使用Enviroment类

string temp="myFullDirectoryPathToDll";string temp2=Environment.GetEnvironmentVariable("PATH")+";"+temp;Environment.SetEnvironmentVariable("PATH",temp2);

这一点,我认为MSDN应该强调的是,只在这个过程中更改环境变量PATH。

在VS中调试时,appPath不"工作"使用属性->调试->环境并合并环境变量链路

  • 如果您使用本机:做显式链接-对于一些简单的事情来说似乎是一项艰巨的工作,可能在部署时使用appPath注册表项链接没有人有经过验证的答案

以下是一些建议:

  • 您可以将dll作为资源嵌入到主可执行文件中,然后将其提取到临时目录中,并使用LoadLibrary从其加载,然后使用GetProcAddress获取相关函数地址。

  • 您可以使用SetDllDirectory()修改主进程搜索路径,以包含DLL的位置。这样可以避免对系统进行任何全局更改。然后再次使用LoadLibrary/GetProcAddress解析函数地址。

如果您知道DLL可能位于哪里,您可以尝试在运行时使用LoadLibrary()加载它,然后使用GetProcAddress()绑定到需要调用的函数。

如果一个已安装的应用程序向我的全局PATH添加了随机内容,我会很不高兴。因为这会影响所有应用程序,并且可能会产生严重的副作用。

我所看到的是有一个启动脚本
对于用户来说,脚本的外观和行为都像一个应用程序(所以您仍然需要加倍计时)。但是脚本设置了适当的路径,然后启动真正的应用程序。

如果使用DelayLoad,那么在调用任何会导致dll加载的函数之前,请调用LoadLibrary。这将"初始化"应用程序,它不会搜索它。不需要GetProcAddress

如果从Windows快捷方式启动,可以在"起始位置"指定DLL的路径,同时在"目标"位置指定.exe的全名和路径。

如果.exe的目录中有需要的DLL,Windows也应该能够找到它们,因为我相信Windows DLL搜索顺序首先在.exe的路径中查找(当前目录在列表中排名第五)。

我已经使用LoadLibrary/GetProcAddress方法很多次了,我尽量避免它,因为它确实需要一些额外的工作——大量的typedef和typecast。

延迟加载方法在决定调用LoadLibrary时对工作目录起作用。你可以利用这个优势。看见http://msdn.microsoft.com/en-us/library/ms682586(VS.85).aspx获取有关搜索路径顺序的详细信息。

我试图在系统注册表中设置应用程序路径。只有当用户有权访问regedit时,它才能正常工作。并修改环境变量PATH。我的测试用户没有修改变量的管理员权限。