问题标签 [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 投票
1 回答
8839 浏览

dll - LoadLibrary() -“无效的存取存储器位置 (998)”

首先让我说我加载了一个 DLL 就好了。但是当我去加载第二个 DLL 时,它总是会出现“无效的访问内存位置 (998)”错误。

在我的项目中,DLL 基本上包含运行 AI 所需的代码。我构建的另一个应用程序允许您编写简单的代码,然后在后台编译源代码并使其可用于“游戏”。

基本上我可以加载一个 AI (DLL) 并观察它的工作。下次我向它发送命令以加载新的 AI(单独和不同的实体)时,它会失败。我在整个过程中使用了新变量,所以它不应该踩到其他模块。

每个 DLL 看起来都差不多,因为它们都是以基本相同的方式构建的。(DLL 仅由一堆结构和一个函数组成)。我在想,也许 DLL 中有一些共同点使它以某种方式共享同一内存的一部分,但我不知道。

我希望我可以向您展示 DLL 源代码,但它不在这台机器上。

如果您有任何想法,请提前致谢!

-迈克尔

编辑:998 错误的正确名称是“ERROR_NOACCESS”。对于那个很抱歉。

0 投票
3 回答
8106 浏览

c++ - 挂钩 LoadLibrary API 调用

我想加载与应用程序工作目录中不同版本的 DLL。为此,我需要挂钩 LoadLibrary 调用,以便在应用程序调用加载 DLL 时,我可以透明地用该 DLL 的较新版本替换它。我尝试使用 NCodeHook 并在我的 DLL 中有以下代码,我使用 NInjectLib 将其注入应用程序,但它在加载 kernel32.dll 时崩溃。任何人都可以告诉我这是注入呼叫的正确方式还是有其他选择。

0 投票
3 回答
5520 浏览

winapi - OCX 文件上的 LoadLibrary 在 Windows 7 x64 中失败

我需要从用旧版 C++ Builder 编写的旧 Windows 应用程序中打开一个 html 帮助文件。HtmlHelp 是通过 HtmlHelp.ocx 加载的,我是通过 LoadLibrary 加载的。

这多年来一直运行良好,但在 Windows 7 x64 中不再适用。在 Windows7 x86 下它也可能会失败,但我没有任何具有此操作系统的计算机,因此我目前无法尝试。

我正在动态加载 hhctrl.ocx,如下所示:

我检查了 Windows 7 系统上是否存在 %SystemRoot%\System32\hhctrl.ocx 并且确实存在。

为什么通过 LoadLibrary 加载它会失败?我该如何解决这个问题?

编辑: GetLastError 说(用德语,所以我只是在翻译):“找不到文件。” 但我调试了函数,路径是“%SystemRoot%\System32\hhctrl.ocx”,文件确实存在。

此外,由于两个答案指向 64 位与 32 位问题的方向:我的应用程序是在 C++ Builder 5 中编译的 32 位可执行文件,因此如果我没记错的话,它应该是 32 位进程。还是我错误地假设?

0 投票
3 回答
1964 浏览

windows - LoadLibrary 静态/全局变量和线程

假设我有一个具有以下静态/全局的 DLL:

除了 ClassA 的实现之外,它还包含一个“常规”ClassB,如果尚未构建 ClassA,它将无法正常工作(这就是为什么我将 ClassA 设为静态/全局的原因)。

在 Windows 中,我相信 DLL 加载器会在调用 ClassB 的构造函数时加载这个 DLL,对吗?至此,ClassA 将被构造,然后 ClassB 的构造将随之而来。如果出现第二个线程并构造 ClassB,则不会构造 ClassA,因为它已经构造好了。

现在,我的问题是——如果 ClassB 由两个线程同时构造会怎样。所以线程 1 将开始构造 ClassA。线程 2 会等到 ClassA 完全构造好后再执行 ClassB 的构造函数吗?

换句话说,LoadLibrary() 是否使用 CriticalSection 来确保 DLL 的静态/全局变量的线程安全初始化?我的预感是“是的”,但我似乎找不到任何文件说一种或另一种方式。

0 投票
7 回答
23104 浏览

c++ - 有没有更好的方法在 C++ 中加载 dll?

现在我做这样的事情,如果我最终有很多我想在我的 DLL 中引用的函数,这似乎很混乱。是否有更好、更简洁的方法来访问函数,而无需为每个函数定义创建 typedef,以便正确编译和加载函数。我的意思是函数定义已经在 .h 文件中,我不应该在加载函数后重新声明它们(或者我是吗?)有没有比使用 LoadLibary 更好的解决方案?如果有一种方法可以在 Visual Studio 2005 项目设置中执行相同的操作,我不一定需要该功能。


BHannan_Test_Class.h


BHannan_Test_Class.cpp


dll_test.cpp

0 投票
1 回答
723 浏览

dll - 基于可变参数调用任何 dll 函数

我在结构中有以下项目:
- Dll 名称(绝对/相对路径)
- dll 中的函数名称
- 参数数量
- 参数类型和值的数组

有了这些信息,我需要加载 dll 并调用函数。
要加载 dll,我会使用 LoadLibrary。
要获取函数的地址,我会使用 GetProcAddress。
调用函数。
要卸载 dll,FreeLibrary

由于函数的参数数量是动态的,我不确定如何将参数传递给函数。

谁能提供一些有关如何将参数传递给 dll 函数的详细信息?

谢谢和问候, V Karthick

0 投票
2 回答
1058 浏览

asp.net - 非托管 dll 的 LoadLibrary 在 ASP.NET 应用程序中返回 IntPtr.Zero

我正在尝试调用 LoadLibrary 并在 ASP.NET 应用程序中加载 Delphi dll。在我的生产机器上一切正常(使用 VS 集成服务器),但是当我将它放在目标服务器上时,LoadLibrary 返回 IntPtr.Zero。File.Exists(libraryName)返回真。可能是什么问题?

0 投票
6 回答
14009 浏览

c++ - 如何在 C++ 中使用带有 LoadLibrary 的 COM DLL

首先,COM 对我来说就像黑魔法。但是我需要在我正在处理的一个项目中使用 COM dll。

所以,我有一个我正在开发的 DLL,我需要一些在单独的 COM DLL 中可用的功能。当我使用 Depends.exe 查看 COM DLL 时,我看到了 DllGetClassObject() 和其他函数之类的方法,但没有一个我感兴趣的函数。

我可以访问 COM DLL(旧版)源代码,但它一团糟,我宁愿像一个不​​知道里面发生了什么的大黑盒子一样使用二进制形式的 COM DLL。

那么,如何使用 LoadLibrary 从我的代码中调用 COM DLL 函数?是否可以?如果,是的,你能给我一个如何做的例子吗?

我正在为这个项目使用 Visual Studio 6。

非常感谢!

0 投票
3 回答
1485 浏览

c++ - 依赖于其他 DLL 的插件 DLL

我正在编写一个 DLL 以插入另一个(第 3 方)应用程序。DLL 将需要依赖另一组 DLL(出于许可原因,我无法静态链接)。

我希望我的 DLL 可以“xcopy-deployable”到任何目录。我也不想要求将此目录添加到路径中。

如果我只是以通常的方式构建 DLL,Windows 将拒绝加载 DLL,因为它找不到当前进程旁边的 DLL。

有没有什么好的选择可以帮助 Windows 找到 DLL?


回答一些问题:

  • DLL 是用 C++ 编写的。
  • 额外的 DLL 是 QT-dll。
  • 我想将额外的 DLL 放在与我的插件 DLL 相同的文件夹中。我可以从中获取该文件夹的名称GetModuleFileName
  • 该应用程序是 Firefox,DLL 是一个 PKCS#11 安全模块。
  • 应用程序使用 DLL 的完整路径加载 DLL(用户在安装插件时提供它)。
  • 要求将 DLL 放置在 System32 中或应用程序旁边是可行的,但它有点混乱,可能会导致卸载程序出现问题。
  • LoadLibrary当然会起作用,GetProcAddress但在我的情况下并不可行。我在其他 DLL 中使用了数百甚至数千种方法。我真的需要使用导入库。

我曾考虑SetDllDirectory在 DllMain 中使用延迟加载的 dll。有没有人尝试过这样的事情?

0 投票
3 回答
89583 浏览

dll - 在 64 位应用程序中加载 32 位 DLL 库

有没有办法加载 32 位 DLL 库(与 LoadLibrary 的用法相同)我想将该函数与 GetProcAddress 一起使用。

我查看了 WOW,但它似乎没有提供该功能。该功能应该存在,因为像 DependencyWalker 这样的工具能够读取 32 位 dll 的符号,即使它是 64 位的。

谢谢