问题标签 [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.
c++ - .LIB 文件是否需要在 C++ 中调用 DLL 而不是 C# P/Invoke?
我一直在寻找有关如何从 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 文件?
windows - 从另一个 DLL 加载库
如MSDN中所述,DLL 查找路径为:
- 当前进程的可执行模块所在的目录。
- 当前目录。
- Windows 系统目录。GetSystemDirectory 函数检索此目录的路径。
- Windows 目录。GetWindowsDirectory 函数检索此目录的路径。
- PATH 环境变量中列出的目录。
这带来了以下疑问:
假设我在某个目录中有一个可执行文件,例如:c:\execdir\myexe.exe
它加载了一个 DLL,该 DLLPATH
位于c:\dlldir\mydll.dll
. 现在,假设mydll.dll
尝试使用LoadLibrary
. 首先将查看哪个目录 -c:\dlldir
或c:\execdir
?
我认为上面引用的查找规则说这将是c:\execdir
因为据称这是“当前进程的可执行模块所在的目录”,但最好从另一个来源获得确认。
编辑:另外,被c:\dlldir\
看了吗?毕竟,它既不是 .exe 所在的位置,也不是“当前目录”(如果这是一般意义上的意思)。
PS我对Windows XP和7都感兴趣。
c - 尝试从matlab调用dll函数导致崩溃
我正在尝试在 MATLAB 中使用第三方外部 DLL(来自 usbmicro),但它不断使 MATLAB 崩溃。这是来自说明从 C 程序中调用函数的语法的文档:
我试过这个 MATLAB 脚本(是的,它很笨拙,我是一个 MATLAB 菜鸟):
和这个:
在这两种情况下,calllib()
调用都会导致 MATLAB 因分段错误而崩溃。
MATLAB版本为7.10;操作系统是 Windows Vista。
更新:
这是 libfunctionsview USBm 的截图:
这是头文件:
更新:
我尝试更改此行:
对此:
在头文件中,然后重新启动 MATLAB。我再次运行我的代码,MATLAB 仍然崩溃。
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 位环境中加载它?
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 环境变量。
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
c# - 在 C# 中加载 mfc DLL
我有一个 mfc dll,我喜欢将它加载到 C 语言程序中!
问题是他在函数中使用原始数据类型(例如 int)来加载,但我需要自己的类型(getInstance() 的类对象)!
有没有简单的方法可以做到这一点?
谢谢,问候 leon22
c++ - C++ 中的 GetProcAddress 函数
大家好:我已经在我的项目中加载了我的 DLL,但是每当我使用 GetProcAddress 函数时。它返回 NULL!我该怎么办?我在“MYDLL.dll”中使用这个函数( double GetNumber(double x) )
这是我使用的代码:
c++ - 在 Visual c++/qt 应用程序中加载第三方 dll
我有需要与我的应用程序一起使用的第三方 dll。该接口是在第三方 dll 中定义的,我必须从我的应用程序中进行接口调用。我有接口的函数原型,但没有lib文件或头文件。看起来应该使用 loadlibrary,但是没有头文件可以吗?有没有办法生成这样的头文件?也非常感谢对负载库的一些解释,因为我仍然掌握这个想法。谢谢!
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)以管理员身份运行并没有改变任何东西