问题标签 [loadlibrary]

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 投票
9 回答
41699 浏览

visual-c++ - LoadLibrary() 错误代码 127

我在使用 LoadLibrary() 时遇到问题,并且收到一个对我来说没有意义的错误:

错误是 127(“找不到指定的过程。”) 这对我调用 LoadLibrary() 没有任何意义。 我还没有调用 GetProcaddress()。

DLL(和应用程序)都使用 VS++ 2005 SP1 编译。

可能出了什么问题?

0 投票
3 回答
2314 浏览

c# - 在 Vista x64 下 LoadLibrary 失败

在我从 XP 迁移到 Vista 之后,我意识到我的 C# 程序不起作用。

情况是这样的:我编写了一个 C++ dll,在我的 C# 应用程序中使用。该 DLL 在 XP 中运行良好,但是当我迁移到 Vista 时,它不再在 C# 中运行。

我在 Delphi 中对其进行了测试,工作正常,但是 C# - 没有。

我编写了额外的代码以使我在 C# 中的检查更容易。

它不需要 C++ 运行时,因为它是使用库编译的,并且可以在 Vista 上的 Delphi 中运行,但不能在 C# 中运行。

问题可能出在哪里?

提前致谢。

0 投票
6 回答
5139 浏览

c++ - 优雅地捕获 LoadLibrary() 错误

我正在开发一款在 Windows XP 和 Windows Vista 之间的所有 Windows 版本上运行的 C++ 软件。在我的代码中,我开发了一个链接到标准库(Qt 库)的 DLL。部署我的软件后,用户在他的系统上没有完全相同的 Qt 构建但配置略有不同的情况并不少见。可能有一些功能被禁用(因此他们的 Qt 构建不会导出相同的符号集)或者库甚至可能以使库二进制文件与原始文件不兼容的方式进行更改。

在某些时候,我正在通过 LoadLibrary() 调用加载我的 DLL。这会引入用户系统上的任何 Qt 库。如果幸运的话,他们的 Qt 版本与我在开发 DLL 时使用的版本兼容,因此 LoadLibrary() 成功。但是,根据他们对 Qt 构建所做的更改,LoadLibrary() 调用有时会失败并显示

  • “指定的模块无法找到。”; 如果他们的 Qt 构建包含的 DLL 少于我的 Qt 构建,通常会发生这种情况。所以我的 DLL 尝试加载例如 QtFoo.dll 但由于这个 dll 不是他们 Qt 构建的一部分,所以加载我的 DLL 失败。
  • "找不到指定的程序。"; 如果他们更改 Qt 构建以禁用某些功能,这通常会发生这种情况,从而导致导出的符号减少。

我的问题是:如何优雅地捕捉这些错误?对,我只是使用 GetLastError() 然后打印上述两条消息中的任何一条。但是,如果我知道找不到哪个模块,或者缺少哪个程序,那会更有用。我注意到,当在资源管理器中运行一个链接到缺少的 DLL 的应用程序时,资源管理器设法产生一个很好的“由于缺少所需的库 blah.dll,因此无法加载应用程序 foo”。是否有一些 API 可用于获取有关为什么 LoadLibrary() 调用完全失败的更多信息?

0 投票
3 回答
1710 浏览

c++ - 如何在 COM 中跨多个线程使用 LoadLibrary?

假设我有以下代码在多线程 COM 应用程序的一个线程中运行:

这一切都很好,然后我可以打电话

这也有效!现在,另一个线程出现并加载了它的 foo:

这也很有效。在线程 2 中,我可以调用 DoSomething:

现在,当线程 1 最终消失时,我遇到了问题。我注意到在 Visual Studio 中调试 DoSomething 的地址不再能够被评估。在第一个线程死后,当我调用时:

我遇到访问冲突。myFooInThread2 指针仍然有效,但函数指针无效。该函数指针是通过调用 loadUpFoo 设置的,而 loadUpFoo 又位于 LoadLibrary 加载的 dll 中。

我的问题是:我从哪里开始寻找失败的原因?外部 DLL(我使用 LoadLibrary 加载)在我的 foo 结构中设置函数指针的方式是否存在问题?还是与使用同一库的不同线程有关?或者,它是否与我在此应用程序中使用 COM 相关(在第一个线程中调用 CoUninitialize 会以某种方式释放此内存或库)?

如果看起来可能是负责任的,我可以提供有关 COM 设置的更多详细信息。谢谢!

编辑:感谢到目前为止的建议。foo 结构是不透明的——我不太了解它的实现。foo 结构在我导入的标头中声明。没有我明确调用的引用计数方法,也没有与使用 LoadLibrary 加载的库的其他交互。我很确定 foo 结构不是内存映射到某个 COM 类,但就像我说它是不透明的,我不能肯定地说。

foo 指针的生命周期得到妥善管理(未删除)。

foo 结构是一个加密库,所以我不能再泄露了。在这一点上,我确信我在不同线程和 COM 应用程序中使用 LoadLibrary 本质上没有任何问题(并且我认为函数指针内存清理是由库本身中的某些东西引起的,我无法控制)。

0 投票
3 回答
4179 浏览

java - 如何在 Java 中反转 System.loadLibrary

我正在编写一个 JNI 程序,我想在使用完它后卸载 dll。为此,我能做些什么?unloadLibrary()我在 Javadoc 中找不到方法。

0 投票
3 回答
4723 浏览

c++ - 使用 LoadLibrary 和 GetProcAddress 调用 WinSock 函数

基本上我有一个这样的头文件:

然后我做这样的事情:

但是,当我调用此函数(带有 (*start)(test, &wsdata) 的行)时,我收到以下错误消息:

sockets.exe 中 0x7868146a 处未处理的异常:0xC0000005:访问冲突。

我尝试更改调用约定(__cdecl、WINAPI、WSAAPI),但它总是以相同的错误消息结束。

0 投票
6 回答
3019 浏览

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

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

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

0 投票
2 回答
5676 浏览

c++ - LoadLibraryW 在 LoadLibraryA 完成工作时不起作用

我编写了一些示例程序和 DLL 来学习 DLL 注入的概念。

我将 DLL 注入示例程序的注入代码如下(省略错误处理):

Memory::CreateThread 如下:

问题是,该模块未加载。但是,当我将第二行更改为

它可以工作(因为测试 dll 的名称中没有 unicode 字符)。

如何让它工作LoadLibraryW

0 投票
2 回答
3839 浏览

c++ - 如何测试DLL是否可以正常加载

我有一个本机 C++ 应用程序(没有花哨的 .Net 东西,只有 C++)。但是,它通过混合模式包装 dll 文件使用一些可选的 .Net 程序集。这些 dll 使用延迟加载加载。混合模式包装器的事情是它们需要完全信任才能加载。因此,当应用程序尝试使用该 dll 时,如果它不存在或者它不受信任,那么整个事情就会崩溃并出现令人讨厌的错误消息。

但我的情况是,只要我的主要应用程序担心它可以在没有这些 dll 文件的情况下生存。所以我需要一种方法来检查这些 dll 是否可以加载(文件在那里并且受信任)。为了做到这一点,我尝试在 try catch 块中对其中一个 dll 函数进行虚拟调用,希望捕获异常,但它仍然因“找不到模块”异常而崩溃。

我们还尝试用自定义的异常过滤器替换未经处理的异常过滤器,但仍然没有运气。

我们还尝试使用 LoadLibrary 方法首先加载 dll 并检查返回值。但是,即使它不受信任,该函数也会加载 Dll,但当我们尝试进行方法调用时会崩溃。

我不认为这是一个未解决的问题。在不实际尝试加载并最终崩溃的情况下检查 dll 是否可以使用有多难?有任何想法吗?

0 投票
2 回答
4198 浏览

mfc - VC++-MFC:LoadLibrary 返回无效句柄 0x10000000

我无法使用LoadLibrary()API 加载我的 test.dll(在 VC++ - MFC 中)。我126 (Module not found)使用GetLastError(). 通过依赖walker,我知道我的test.dll 依赖于“xerces-c_2_7.dll”和“Xalan-C_1_10.dll”。这些 dll 已经存在于与 exe 相同的路径上。我仍然收到错误消息。所以我尝试加载上述两个第三方 dll,使用LoadLibrary()返回的句柄为0x10000000. 通过GetLastError()我得到

谁能指导我为什么会收到 Invalid Handle 错误?

下面是代码片段: