我有一个使用dll的原生VC ++项目(不在项目中)。现在,我必须把dll放在一个“Windows用来查找DLL的搜索路径”中 link
但我不希望dll位于exectuable或current或windows或system目录中。
所以我唯一的选择就是添加%PATH%环境变量的路径。
还有其他办法吗?
是否有一种优雅的方式(添加到PATH)?我应该在安装时这样做吗?如果我这样做,我应该担心吗?
答案 0 :(得分:5)
总结我找到的所有技术:
string temp =“myFullDirectoryPathToDll”; string temp2 = Environment.GetEnvironmentVariable(“PATH”)+“;” + temp; Environment.SetEnvironmentVariable(“PATH”,temp2);
这个,我认为MSDN应该强调,只在这个过程中更改环境变量PATH。
在VS中调试时,appPath无法正常工作 使用properties-> debug->环境并合并环境变量 link
答案 1 :(得分:4)
以下是一些建议:
您可以将dll作为资源嵌入主可执行文件中,然后将其解压缩到临时目录并从其使用的LoadLibrary加载,然后使用GetProcAddress获取相关的函数地址。
您可以使用SetDllDirectory()修改主进程搜索路径以包含DLL的位置。这避免了必须对系统进行任何全局更改。并再次使用LoadLibrary / GetProcAddress来解析函数地址。
答案 2 :(得分:1)
如果您知道DLL可能位于何处,您可以尝试使用LoadLibrary()在运行时加载它,然后使用GetProcAddress()绑定到您需要调用的函数。
答案 3 :(得分:1)
如果已安装的应用程序将随机内容添加到我的全局PATH中,我将不会高兴。因为这会影响所有应用程序,并且可能会产生令人讨厌的副作用。
我所看到的是有一个入门脚本 该脚本看起来和行为类似于用户的应用程序(所以你仍然双倍计时)。但是脚本设置了适当的路径,然后启动了真正的应用程序。
答案 4 :(得分:1)
如果使用DelayLoad,则在调用任何将导致dll加载的函数之前,请调用LoadLibrary。这将“启动”应用程序,它不会搜索它。不需要GetProcAddress
答案 5 :(得分:0)
如果从Windows快捷方式启动,则可以在“开始”位置指定DLL的路径,同时在“目标”位置指定.exe的全名和路径。
如果.exe目录中有DLL需要,Windows 也应能够找到它们,因为我相信Windows DLL搜索顺序首先在.exe的路径中查找(当前目录在列表中排名第五)。
我多次使用LoadLibrary / GetProcAddress方法,我试图避免它,因为它确实需要一些额外的工作 - 很多typedef和typecasts。
答案 6 :(得分:0)
延迟加载方法在决定调用LoadLibrary
时对工作目录起作用。您可以利用这个优势。有关搜索路径顺序的详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms682586(VS.85).aspx。
答案 7 :(得分:0)
我尝试在系统注册表中设置应用程序路径。只有当用户有权访问regedit时,它才能正常工作。并且还修改环境变量PATH。 我的测试用户没有管理员权限来修改变量。