问题标签 [setdlldirectory]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
15006 浏览

dll - 添加自定义DLL搜索路径@应用启动

我绞尽脑汁试图想出一个优雅的解决方案来解决 DLL 加载问题。我有一个静态链接到加载 DLL 的其他 lib 文件的应用程序。我没有直接加载 DLL。我想在可执行文件所在的文件夹之外的另一个文件夹中有一些 DLL。像 %working_folder%\dlls 之类的东西 - 我宁愿在我的 %working_folder% 中没有几十个(是的......几十个)DLL .

我正在尝试开发一些作为主应用程序一部分的东西,它将调整搜索路径@启动。我遇到的问题是这个新的自定义 DLL 路径不在系统搜索路径中。当我启动应用程序时,它会崩溃(STATUS_DLL_NOT_FOUND),因为必要的 DLL 不在适当的位置。我想做的是检查@startup这个新的自定义DLL文件夹是否在进程环境变量搜索路径中,如果没有添加它。问题是,应用程序会在应用程序执行一行代码之前尝试加载所有这些 DLL。

我该如何解决?我考虑过编写一个帮助应用程序,它首先启动,适当地调整环境变量并通过 CreateProcess 启动主应用程序。我敢肯定这会奏效,但它会让开发人员感到困难。当他们调试主应用程序时,他们不会首先启动辅助应用程序——他们甚至不能这样做。

我尝试了注册表应用程序路径功能,但没有成功。和以前一样的鸡和蛋问题。

我可以在这里做什么?

0 投票
1 回答
266 浏览

winapi - 如何应对 GetDllDirectory 产生的模棱两可的价值?

GetDllDirectory产生一个模棱两可的值。当此调用生成的字符串为空时,表示以下情况之一:

  • 没有人打电话SetDllDirectory
  • 有人NULL传给SetDllDirectory
  • 有人将一个空字符串传递给SetDllDirectory

前两种情况对我来说是等价的,但第三种情况是个问题。如果我想编写保存/恢复代码(调用GetDllDirectory以保存“旧”值,SetDllDirectory临时设置“新”值,然后SetDllDirectory再次恢复“旧”值),我冒着逆转其他程序员意图的风险.

如果另一个程序员打算让当前工作目录处于 DLL 搜索顺序中(换句话说,前两个项目符号之一为真),并且我将一个空字符串传递给SetDllDirectory,我将把当前工作目录从DLL 搜索顺序,颠倒了其他程序员的意图。

任何人都可以提出一种方法来消除或解决这种歧义吗?

PS 我知道在 DLL 搜索顺序中有当前工作目录可能被解释为一个安全漏洞。尽管如此,这是默认行为,我的代码无法撤消它;我的代码需要与所有潜在调用者的期望兼容,其中许多都很大而且很旧并且超出了我的控制范围。

0 投票
3 回答
4811 浏览

security - Delphi中如何调用WinAPI函数SetDllDirectory()?

我想防止加载可能通过访问当前工作目录的恶意 DLL,如http://msdn.microsoft.com/en-us/library/ff919712(VS.85).aspx中所述

在我们的 C++ 应用程序中实现的解决方案是对 SetDllDirectory("") 进行 WinAPI 调用,这将有效地从 Windows DLL 加载搜索路径中删除当前工作目录。然而,这个解决方案似乎不适用于我们的 Delphi 应用程序,因为 SetDllDirectory() 函数不存在。

Delphi 中是否有与 SetDllDirectory("") 执行相同操作的等效调用?谢谢!

0 投票
1 回答
346 浏览

iis - ISAPI 扩展加载错误的 DLL

IIS 加载旧版 ISAPI 扩展和 IIS 模块,两者都使用同名的 DLL,但是这些 DLL 是不同的(链接到不同版本的第三方)。到目前为止应该没有问题,每个组件(扩展和模块)都驻留在自己的文件夹中,每个都有自己的 DLL 版本,但是当 IIS 启动工作进程并且扩展和模块以某种方式加载时,扩展会尝试加载来自模块文件夹的 DLL。我检查了模块的代码,发现使用 SetDllDirectory 会影响整个过程。瞧,这就是问题所在,我说。在摆脱了这个调用(用适合我需要的 DLL 搜索标志的 LoadLibraryEx 替换)之后,问题仍然存在。最后,我发现自己为这两个 DLL 赋予了唯一的名称,这显然(或没有)解决了问题。然而,它不是干净和优雅的解决方案。有谁知道为什么 IIS 表现出如此奇怪的行为?

运行 Win2008、IIS7.5、ISAPI 扩展 - 本机、C++、VC2010、IIS 模块 - 本机、C++、VS2010,上面有问题的 DLL - C++/CLI,与 .NET3.5 第三方程序集链接。一切都是 x64

0 投票
1 回答
618 浏览

c++ - SetDllDirectory 未在此范围内声明-Netbeans 7.1

我在我编写的代码之一中使用 SetDllDirectory() 但是在编译项目时出现错误:

这是代码片段

0 投票
3 回答
8096 浏览

c++ - DLL 中的 SetDllDirectory LoadLibrary

我可以在 C++ DLL 中使用 C++SetDllDirectoryLoadLibrary命令来加载另一个 DLL 吗?我试过像这样使用它们:

可执行文件调用第一个 DLL,然后第一个 DLL 加载第二个 DLL,然后第二个 DLL 进行计算...

但是当我运行可执行文件时,我收到以下错误消息:

此应用程序已请求运行时以不寻常的方式终止它。请联系应用程序支持团队了解更多信息。

直接链接到可执行文件时,第二个 DLL 工作正常!

这是我的可执行文件中的代码:

这是第一个 DLL 中的代码:

0 投票
1 回答
2359 浏览

c++ - 在 C++ 中使用 Octave 库(DLL 等)而不安装 Octave(只需复制安装文件夹)

在我的 C++ 解决方案中,我有一个 DLL。我的 DLL 使用 Octave C++ 类并且还使用 Octave 作为“嵌入式”引擎。通过使用以下步骤(第一种方法),我可以构建我的 C++ 解决方案并运行构建的可执行文件,并在一些文本文件中获得输出结果,没有任何问题:

但是当我尝试使用以下步骤(第二种方法)时,我遇到了问题(我会解释问题):

问题是当我使用第二种方法时,只要我保持安装文件夹C:\Software\Octave-3.6.1不变,它就可以完美运行。我的意思是当我重命名安装文件夹或删除它时,或者当我卸载 Octave 时,我的解决方案会编译并构建可执行文件,但在运行可执行文件时,它不会生成任何结果(结果是一堆文本文件和输出文件将为空)。我想知道是否有人知道原因和解决方案。谢谢。

0 投票
1 回答
224 浏览

windows - SetDllDirectory 失败,错误代码为 183(“当该文件已存在时无法创建文件”)

我们正在开发一个 Visual Studio 插件,为此我们创建了一个具有一些新功能的 dll。然后我们调用 SetDllDirectory 将我们的安装路径添加到 dll 搜索路径中,我们得到错误代码 183,意思是“当该文件已存在时无法创建文件”。我们确定这是有问题的调用,因为我们激活了记录器。我们添加的路径是有效的,并且存在于我们启动 VS 的机器上。

知道可能是什么原因造成的吗?我们在网上没有找到这样的参考...

谢谢,奥伦

0 投票
1 回答
575 浏览

c++ - 从另一个进程调用 SetDllDirectory 不起作用?

我一直在尝试从一个“注入器”程序切换我不拥有的程序的 Dll 目录,该程序假设切换 Dll 加载目录以加载修改或点击的 Dll。

这是功能:

我无法弄清楚为什么这不起作用?

0 投票
2 回答
147 浏览

c++ - Expression: string iterators incompatiable, when calling "SetDllDirectory"

I'm receiving following error:

Debug Assertion Failed!

Expression: string iterators incompatible

When trying to run such a code:

#xA;

Does someone know why

BTW: I followed this.