4

我有一个使用 dll 的本机 VC++ 项目(不在项目中)。现在,我必须将 dll 放在“Windows 用来定位 DLL 的搜索路径” 链接中

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

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

还有其他方法吗?

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

4

8 回答 8

5

总结一下我发现的所有技术:

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

字符串 temp = "myFullDirectoryPathToDll"; 字符串 temp2 =Environment.GetEnvironmentVariable("PATH") + ";" +温度;Environment.SetEnvironmentVariable("PATH", temp2);

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

在 VS 中调试时,appPath 不起作用,请使用属性->调试->环境并合并环境变量 链接

  • 如果您使用本机:做显式链接 - 对于简单的事情来说似乎很重要,也许在部署 链接上使用 appPath 注册键,没有人有一个经过测试和证明的答案
于 2008-10-23T15:37:29.240 回答
4

这里有一些建议:

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

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

于 2008-10-23T13:27:37.347 回答
1

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

于 2008-10-23T13:17:59.303 回答
1

如果已安装的应用程序将随机内容添加到我的全局 PATH,我将不高兴。因为这会影响所有应用程序,并且可能会产生令人讨厌的副作用。

我所看到的是有一个启动脚本。
该脚本对用户来说看起来和行为就像一个应用程序(所以你仍然可以加倍时钟)。但是脚本设置了适当的路径,然后启动了真正的应用程序。

于 2008-10-23T13:19:30.203 回答
1

如果您使用 DelayLoad,则在调用将导致 dll 加载的任何函数之前,请调用 LoadLibrary。这将“启动”应用程序,它不会去搜索它。不需要 GetProcAddress

于 2008-10-23T17:37:56.360 回答
0

如果您从 Windows 快捷方式启动,您可以在“Start in”位置指定 DLL 的路径,同时在“Target”位置指定 .exe 的全名和路径。

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

我已经多次使用 LoadLibrary/GetProcAddress 方法,我尽量避免使用它,因为它确实需要一些额外的工作——大量的类型定义和类型转换。

于 2008-10-23T19:35:45.700 回答
0

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

于 2008-10-23T19:43:04.453 回答
0

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

于 2009-01-15T22:01:34.317 回答