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