使用外部(非项目)dll的本机VC++参考如何指定dll的路径
Native VC++ using external (not project) dll reference how to specify path to dll
我有一个使用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。我的测试用户没有修改变量的管理员权限。
- 挂起和取消挂起一个文件DLL
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 导入库可以跨dll版本工作吗
- C++错误消息*成员参考.**初学者*
- 从C++dll访问C#中的一行主要参数
- 链接到自行创建的dll失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 在决定是通过参考还是通过价值时,尺寸真的是一个问题吗
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 参考资源文件VC++中的$(SolutionDir)
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 复制C DLL以构建任何C#项目的输出,以扩展为参考
- 在 GetProcAddress 的 lpProcName 中是否有 DLL 函数修饰的参考
- 无法添加对WINRT C DLL项目的参考
- 调用函数,该函数在DLL文件上加密,并且该文件被添加为我的sloution中的参考
- 如何使用Visual Studio在.net c++项目上添加一个DLL作为参考
- MSVCR80.DLL C++项目中的参考资料,VS2005
- 使用外部(非项目)dll的本机VC++参考如何指定dll的路径