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

c++ - .LIB 文件是否需要在 C++ 中调用 DLL 而不是 C# P/Invoke?

我一直在寻找有关如何从 C++ 引用非托管 DLL 的答案,

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

Visual C++ 中的 DLL 引用

如果调用者也有.LIB文件,似乎无法在 C++ 中加载 DLL 。如果我想在运行时动态加载 DLL,那么 .lib 文件是否是真的,如下所示?

如果我使用上面的代码调用 LoadLibrary,我得到的结果是 NULL。GetLastError() 的错误代码是 193: ERROR_BAD_EXE_FORMAT。为什么?

编辑/更新: 我发现出了什么问题——我将程序的目标平台(调用 DLL)设置为 x64,一旦我将其更改为 Win32,LoadLibrary 现在返回一个非 NULL 结果。

DLL 由一个源文件 expFns.cpp 组成:

以下是它的编译方式:

如果我使用一些众所周知的 DLL,例如 unrar3.DLL,我仍然会收到错误代码 193。为什么我会收到此错误代码?

另一方面,如果我在托管 C# 中使用 P/Invoke,我只需要 .DLL 的完整路径,不需要 .LIB 文件,并且对 DLL 的函数调用将起作用。为什么在 C++ 中必须要有 .LIB 文件,而 C# 不需要 .LIB 文件?

0 投票
1 回答
1096 浏览

windows - 从另一个 DLL 加载库

MSDN中所述,DLL 查找路径为:

  1. 当前进程的可执行模块所在的目录。
  2. 当前目录。
  3. Windows 系统目录。GetSystemDirectory 函数检索此目录的路径。
  4. Windows 目录。GetWindowsDirectory 函数检索此目录的路径。
  5. PATH 环境变量中列出的目录。

这带来了以下疑问:

假设我在某个目录中有一个可执行文件,例如:c:\execdir\myexe.exe它加载了一个 DLL,该 DLLPATH位于c:\dlldir\mydll.dll. 现在,假设mydll.dll尝试使用LoadLibrary. 首先将查看哪个目录 -c:\dlldirc:\execdir

我认为上面引用的查找规则说这将是c:\execdir因为据称这是“当前进程的可执行模块所在的目录”,但最好从另一个来源获得确认。

编辑:另外,被c:\dlldir\看了?毕竟,它既不是 .exe 所在的位置,也不是“当前目录”(如果这是一般意义上的意思)。

PS我对Windows XP和7都感兴趣。

0 投票
2 回答
4444 浏览

c - 尝试从matlab调用dll函数导致崩溃

我正在尝试在 MATLAB 中使用第三方外部 DLL(来自 usbmicro),但它不断使 MATLAB 崩溃。这是来自说明从 C 程序中调用函数的语法的文档:

我试过这个 MATLAB 脚本(是的,它很笨拙,我是一个 MATLAB 菜鸟):

和这个:

在这两种情况下,calllib()调用都会导致 MATLAB 因分段错误而崩溃。

MATLAB版本为7.10;操作系统是 Windows Vista。


更新:

这是 libfunctionsview USBm 的截图: 截屏

这是头文件:


更新:

我尝试更改此行:

对此:

在头文件中,然后重新启动 MATLAB。我再次运行我的代码,MATLAB 仍然崩溃。

0 投票
2 回答
613 浏览

c# - 在 64 位系统上加载 Corflags:16 dll 到 x86 应用程序崩溃

我在我的项目中使用了一个外部 dll。当我尝试在 64 位机器上运行该应用程序时,它会以FileLoadException. 由于它在 32 位系统上运行良好,我怀疑 dll 是 32 位的。但是,将项目的目标平台设置为 x68 并没有帮助。

在 c# 中的 64 位应用程序中读取 32 位 dll 并在 64 位应用程序中加载32 位 DLL 库和其他一些页面,这些页面告诉我应该将整个应用程序构建为 32 位进程(这不会打扰我 - 它应该可以在 64 位 Windows 上执行),但如果不是通过设置目标平台,我不知道如何在 64 位开发机器上构建 32 位应用程序...

代码只是

QuickFix 的东西来自 dll。

编辑: 我用 CorFlags 检查了 dll 并发现

这意味着 dll 是一个混合模式程序集,只能在 i386 环境中加载(http://blogs.msdn.com/b/slessard/archive/2010/04/09/types-of-managed-code -组件.aspx

是否可以在 64 位环境中加载它?

0 投票
3 回答
6055 浏览

java - Java:加载依赖于其他库的库

我想在我的 java 应用程序中加载我自己的本机库。这些本机库依赖于第三方库(当我的应用程序安装在客户端计算机上时,这些库可能存在也可能不存在)。

在我的 java 应用程序中,我要求用户指定依赖库的位置。获得此信息后,我将使用它来使用 JNI 代码更新“LD_LIBRARY_PATH”环境变量。以下是我用来更改“LD_LIBRARY_PATH”环境变量的代码片段。

Java 代码

Jni 代码 (C)

我也有相应的本地方法来获取环境变量。

我可以成功更新 LD_LIBRARY_PATH(此断言基于 C 例程的输出getenv()

我仍然无法加载我的本机库。仍然没有检测到依赖的第三方库。

任何帮助/指针表示赞赏。我正在使用 Linux 64 位。

编辑:

我写了一个 SSCE(用 C 语言)来测试动态加载器是否工作。这里是 SSCE

C 代码也不起作用。显然,动态加载程序没有重新读取 LD_LIBRARY_PATH 环境变量。我需要弄清楚如何强制动态加载器重新读取 LD_LIBRARY_PATH 环境变量。

0 投票
3 回答
3098 浏览

c++ - can not load a DLL file

Every time I try to load DLL (COM) I get the following error:

LDR: LdrpWalkImportDescriptor() failed to probe for its manifest, ntstatus 0xc0150002

I searched a lot but found nothing. Please I really believe in this site experts and I hope to get a solution to this problem.

I know that the problem is from manifest file but I really don't know what is it and how to fix this

I use VS2010 C++ and LoadLibrary

0 投票
1 回答
2071 浏览

c# - 在 C# 中加载 mfc DLL

我有一个 mfc dll,我喜欢将它加载到 C 语言程序中!

我的源教程:http: //blogs.msdn.com/b/jonathanswift/archive/2006/10/03/dynamically-calling-an-unmanaged-dll-from-.net-_2800_c_23002900_.aspx

问题是他在函数中使用原始数据类型(例如 int)来加载,但我需要自己的类型(getInstance() 的类对象)!

有没有简单的方法可以做到这一点?

谢谢,问候 leon22

0 投票
3 回答
67316 浏览

c++ - C++ 中的 GetProcAddress 函数

大家好:我已经在我的项目中加载了我的 DLL,但是每当我使用 GetProcAddress 函数时。它返回 NULL!我该怎么办?我在“MYDLL.dll”中使用这个函数( double GetNumber(double x) )

这是我使用的代码:

0 投票
2 回答
1034 浏览

c++ - 在 Visual c++/qt 应用程序中加载第三方 dll

我有需要与我的应用程序一起使用的第三方 dll。该接口是在第三方 dll 中定义的,我必须从我的应用程序中进行接口调用。我有接口的函数原型,但没有lib文件或头文件。看起来应该使用 loadlibrary,但是没有头文件可以吗?有没有办法生成这样的头文件?也非常感谢对负载库的一些解释,因为我仍然掌握这个想法。谢谢!

0 投票
2 回答
2777 浏览

c++ - LoadLibrary 在 Win7 32 位上失败,在 Win XP 32 位上成功

我正在尝试将第 3 方 dll(即我没有源代码)加载到我的应用程序中。在 windows xp 32 位系统上,它加载正常,但在 windows 7 系统上,它无法加载,引用来自 GetLastError() 的错误 #998

我使用 dll 导出查看器查看了 dll 的导入和导出符号,并观察到导入表中列出的除了 3 个 dll 之外的所有 dll 都来自这个第 3 方供应商。那些没有的是:
kernel32.dll
mingwm10.dll
msvcrt.dll

这是我用来进行导入的代码:

请提供有关如何进行调试的任何提示?

编辑:感谢大家的回答,这就是我到目前为止所发现的:
a)应用程序工具包包并没有证明是有用的(见下文)
b)同事A可以让dll加载他的胜利7机器和同事B不能,所以它是零星
的c)以管理员身份运行并没有改变任何东西