原生VC ++使用外部(非项目)dll引用如何指定dll的路径

时间:2008-10-23 13:14:52

标签: c++ dll visual-studio-2005 native

我有一个使用dll的原生VC ++项目(不在项目中)。现在,我必须把dll放在一个“Windows用来查找DLL的搜索路径”中 link

但我不希望dll位于exectuable或current或windows或system目录中。

所以我唯一的选择就是添加%PATH%环境变量的路径。

还有其他办法吗?

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

8 个答案:

答案 0 :(得分:5)

总结我找到的所有技术:

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

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

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

在VS中调试时,appPath无法正常工作 使用properties-> debug->环境并合并环境变量 link

  • 如果您使用原生: 做明确的链接 - 看似简单的大工作 也许在部署时使用appPath registery密钥 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。 我的测试用户没有管理员权限来修改变量。