问题标签 [delay-load]

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 投票
6 回答
3019 浏览

c++ - 在 C++ 中禁用自动 DLL 加载

我的场景如下:我的应用程序依赖于某个 DLL(我在链接期间使用它的 lib)。但是,当我的应用程序执行时,我想使用 LoadLibrary 显式加载该 DLL。但是,默认情况下,当代码到达需要该 DLL 的范围时,环境会自动查找它,然后加载它。我想禁用这种行为,而且我关心的是,如果应用程序达到了它想要执行属于该 DLL 的代码的程度,我更喜欢它会崩溃而不是自动加载它(所以 DLL 只会被加载因为我明确地调用了 LoadLibrary)。
同时,我正在使用延迟加载功能(因此只有在实际需要加载 DLL 时才会触发加载)。但是,如果尚未加载 DLL,我希望应用程序会崩溃。

也许这里的任何人都熟悉实现这一目标的方法?

0 投票
3 回答
101250 浏览

c# - 将自定义路径设置为引用的 DLL?

我有一个 C# 项目(称为它MainProj),它引用了其他几个 DLL 项目。通过将这些项目添加到MainProj的引用中,它将构建它们并将它们生成的 DLL 复制到 MainProj 的工作目录。

我想做的是让这些引用的 DLL 位于MainProj工作目录的子目录中,即 MainProj/bin/DLLs,而不是工作目录本身。

我不是一个非常有经验的 C# 程序员,但来自 C++ 世界,我假设一种方法是删除项目引用并通过路径和文件名显式加载所需的 DLL(即在 C++ 中LoadLibrary)。但是,如果有办法,我更愿意做的是设置某种“参考二进制路径”,所以当我构建它们时它们都会自动复制到这个子目录(然后从那里引用而无需我需要明确加载每个)。这样的事情可能吗?

如果不是,那么在 C# 中实现我所追求的首选方法是什么(即带有Assembly.Load/ Assembly.LoadFile/Assembly.LoadFrom的东西?AppDomain也许是什么,或者System.Environment?)

0 投票
4 回答
2434 浏览

c++ - 延迟加载 DLL 和关联的 .lib 文件

我试图在我的应用程序中延迟加载 wintrust.dll 和 crypt32.dll(这些用于在 DLL 中执行数字签名/发布者检查)。我正在使用VS2008。在我的项目属性的链接器部分的延迟加载属性中添加这两个 DLL 作为条目后,我仍然收到 LNK4199 警告,即没有从 DLL 加载任何内容,并且 LNK2019 错误无法解析 WinVerifyTrust 等符号。

将以下内容作为条目添加到 Additional Dependencies 可缓解此问题:crypt32.lib 和 wintrust.lib。我现在对链接没有任何问题。但是,我想知道的是如何确保它没有链接到静态库?由于潜在的许可问题,我不想链接到静态库。我想动态加载安装在 Windows 中的 DLL,并希望 DelayLoad 可以帮助我做到这一点,而不必求助于 LoadLibrary 和 GetProcAddress 函数调用。

非常感谢有关所有不同库使用/链接选项的任何信息!

谢谢。

0 投票
1 回答
1264 浏览

nunit - 在 NUnit 中延迟加载 TestCaseSource

我有一些使用 TestCaseSource 函数的 NUnit 测试。不幸的是,我需要的 TestCaseSource 函数需要很长时间来初始化,因为它递归地扫描文件夹树以查找将传递给测试函数的所有测试图像。(或者,它可以在每次运行时从文件列表 XML 加载,但仍然需要自动发现新的图像文件。)

是否可以将 NUnit 属性与 TestCaseSource 一起指定,以便 NUnit 在用户单击节点或运行测试套件之前不会枚举测试用例(不调用 TestCaseSource 函数)?

需要将所有测试图像存储在一个文件夹中是一个项目要求,因为无权访问测试项目的其他人将需要将新的测试图像添加到该文件夹​​中,而无需修改测试项目的源代码。然后他们将能够查看测试结果。

一些教条式的单元测试人员可能会反驳说我正在使用 NUnit 来做它不应该做的事情。我不得不承认我必须满足一个要求,而 NUnit 是一个很棒的工具,它的 GUI 可以满足我的大部分要求,所以我不在乎它是否是正确的单元测试。

附加信息(来自 NUnit 文档)

对象构造注意事项

NUnit 在加载测试时定位测试用例,使用非静态源创建每个类的实例,并构建要执行的测试列表。每个源对象此时只创建一次,并在加载所有测试后销毁。

如果数据源在测试夹具本身中,则使用为 TestFixtureAttribute 上提供的夹具参数的适当构造函数创建对象,如果未指定参数,则使用默认构造函数创建对象。由于此对象在测试运行之前被销毁,因此这两个阶段之间或不同运行之间无法进行通信,除非通过参数本身。

似乎预先加载测试用例的目的是避免在 TestCaseSource 和测试执行之间发生通信(或副作用)。这是真的?这是要求预先加载测试用例的唯一原因吗?

笔记:

需要对 NUnit 进行修改,如http://blog.sponholtz.com/2012/02/late-binded-parameterized-tests-in.html中所述

有计划将此选项引入到 NUnit 的更高版本。

0 投票
1 回答
246 浏览

dll - 使用非托管代码检查 .net 运行时是否存在

我想创建一个可以由rundll32加载的混合托管/非托管DLL,并在尝试运行任何托管代码之前检查.Net运行时库的存在,因此:

为了实现这一点,我尝试/DELAYLOAD了 CLR(mscoree.dll 等),以便仅在调用 SomeManagedCode() 而不是之前加载它。但是,即使在调用 RunDllEntryPoint() 之前仍会加载 CLR(我可以在加载的模块列表中看到 mscoree.dll)。我相信这是因为编译器正在链接调用 _CorDllMain() 的代码,它必须在调用我自己的入口点之前强制加载运行时。

我知道有一些方法可以重新打包它以使其工作,例如将托管代码拆分为单独的 DLL,但如果有任何方法可以在单个 DLL 中制作上述工作代码,我很感兴趣。

是否有可能真正延迟加载 CLR dll,如果可以,怎么做?

0 投票
1 回答
3631 浏览

visual-c++ - 无法找到 SHCreateItemFromParsingName (SHELL32.dll)

大家下午好

我想设置语音识别宏以在我的 PC (Windows XP Professional SP3) 上运行,所以我安装了 Windows 语音识别宏。但是,当我单击它时,它会指出: 过程 入口点 SHCreateItemFromParsingName 不能位于动态链接库 SHELL32.dll中。所以...

我安装了 Microsoft Visual Studio C++ 2010 然后...点击调试 - 星调试,然后项目 - Shell 32 属性 - 通用属性 - 链接器 - 输入 - 延迟加载的 DLL,然后编辑并输入 /DELAYLOAD:shell32.dll。

但是,当我单击 Windows 语音识别宏时,我仍然收到相同的错误消息。

请问你能帮忙吗??!亲切的问候

0 投票
0 回答
241 浏览

c++ - Win7上编译的延迟加载dll在XP上无法加载

我使用的是 VC++ 2010。A.dll 依赖于 B.dll,并在 A 的项目设置中将 B.dll 设置为延迟加载。在 Win7 x64 位操作系统上构建它们。win7操作系统加载B.dll没问题,XP x64操作系统加载B.dll失败。如果去掉延迟加载设置,B.dll 也可以在 XP OS 上加载。如果 dll 是在 XP 上构建的,它们可以在 XP 上加载。

为什么在Win7上构建的延迟加载dll在XP上无法加载?我怎样才能让它工作?

0 投票
2 回答
9950 浏览

c++ - 应用程序多次启动时延迟加载 DLL:“异常 0xC06D007E:找不到模块”

我在使用延迟加载 DLL 的应用程序中遇到了间歇性崩溃的情况。有几个不同的调用堆栈我们已经看到了崩溃,但它总是在引发时0xC06D007E: Module not found崩溃__delayLoadHelper2

连续多次(连续)调用进程时会引发异常。这是一个示例调用堆栈:

c++ 应用程序正在使用延迟加载 DLL 加载 .NET 代码。

发生崩溃的计算机是非常强大的机器(12 核 CPU,48 g ram),我不确定它是否对其有影响。但由于崩溃并非一直发生,它看起来像是一个竞争条件或资源问题。

这个论坛帖子描述了我的情况,但没有解决方案。

知道为什么会发生这种情况吗?

0 投票
2 回答
694 浏览

c++ - 使用延迟加载加载正确的库 - 返回值类型错误

我在这里使用了 msdn 文档:http: //msdn.microsoft.com/en-us/library/f0fkfy9y (v=vs.100).aspx

它在那里指定:

所以我尝试了以下方法:

返回 HMODULE 时出现错误:

'return' : 无法从 'HMODULE' 转换为 'FARPROC'。

问题是什么?我在做一些破旧的事吗?他们确实说返回你自己的 HMODULE,这就是我所做的......

0 投票
1 回答
4406 浏览

visual-studio-2013 - 无法打开输入文件“Delayimp.lib”

我正在 Visual Studio 2013(操作系统:Windows 7)下编译一个项目。该项目使用平台工具集“Visual Studio 2008 (v90)”编译。在选项中,我设置了一个要延迟加载的 dll,如下所示:

/DELAYLOAD:"PluginPost.dlll"

我得到的错误如下:

1>LINK : 致命错误 LNK1181: 无法打开输入文件 'Delayimp.lib'

现在我的问题如下。我知道我需要Delayimp.lib 才能加载延迟的dll,但是我在哪里可以找到这个Delayimp.lib?

提前感谢您的任何提示。

PS。我正在编译一个 64 位应用程序。