LoadLibrary 函数返回错误代码 182。来自 MSDN:
ERROR_INVALID_ORDINAL: "操作系统无法运行 %1"
有没有人对这个错误有更好的描述?
我正在尝试加载我使用独立 NDK 工具链构建的库。
我构建了 libGLmove.so 并将其放置在我的 Eclipse 项目的 libs/armeabi 中
然而,调用System.loadLibrary("GLmove")抛出一个UnsatisfiedLinkError
关于如何解决问题或让 Android 找到我的库的任何想法?ndk-build 构建后如何打包库?
编辑:确切的编译标志是:
/Users/thomas/Documents/android-ndk-r5b/toolchains/arm-eabi-4.4.0/prebuilt/darwin-x86/bin/arm-eabi-g++ --sysroot=/Users/thomas/Documents/android-ndk -r5b/platforms/android-8/arch-arm -march=armv7-a -mfloat-abi=softfp -mfpu=neon -Wl,--fix-cortex-a8 -fno-exceptions -fno-rtti -nostdlib -fpic -shared -o GLmove.so -O3
我正在编写一个从MATLAB调用的C-DLL.是否可以使用const char **参数调用函数?例如
void myGetVersion( const char ** );
Run Code Online (Sandbox Code Playgroud)
C代码是:
const char *version=0;
myGetVersion( &version );
Run Code Online (Sandbox Code Playgroud)
什么是相应的MATLAB-Code(如果可能的话)?
非常感谢你!
PS:我认为这是帮助页面,但我找不到我的情况:-(
我正在研究动态加载特殊配方DLL的东西.在考虑使用此DLL之前,我需要能够检查DLL并确保所有预期的功能都存在.如果它缺少某些功能,我不应该尝试加载它.我知道我可以尝试调用其中一个函数并查看是否存在异常,但我会在调试模式下看到错误.
如果函数存在,我该如何检查DLL?我想在加载它之前检查它(使用LoadLibrary),但我想如果我必须加载它来执行此检查也没问题.
UPDATE
我在下面接受了David的回答,并且认为我会发布我的最终代码以显示整个过程.我把它变成了一个函数返回一个Bool,无论它是否成功,清理了一下代码,并在底部添加了另一个函数,使用这个函数逐个检查每个名字.
我决定使用这种方法而不是阅读,GetProcAddress因为它将来会帮助我解决其他问题.
type
PIMAGE_NT_HEADERS = ^IMAGE_NT_HEADERS;
PIMAGE_EXPORT_DIRECTORY = ^IMAGE_EXPORT_DIRECTORY;
function ImageNtHeader(Base: Pointer): PIMAGE_NT_HEADERS; stdcall;
external 'dbghelp.dll';
function ImageRvaToVa(NtHeaders: Pointer; Base: Pointer; Rva: ULONG;
LastRvaSection: Pointer): Pointer; stdcall; external 'dbghelp.dll';
function ExportedFunctionNames(const ImageName: string; NamesList: TStrings): Bool;
var
i: Integer;
FileHandle: THandle;
ImageHandle: THandle;
ImagePointer: Pointer;
Header: PIMAGE_NT_HEADERS;
ExportTable: PIMAGE_EXPORT_DIRECTORY;
NamesPointer: Pointer;
Names: PAnsiChar;
NamesDataLeft: Integer;
begin
Result:= False;
NamesList.Clear;
FileHandle:= CreateFile(PChar(ImageName), GENERIC_READ, FILE_SHARE_READ,
nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if FileHandle …Run Code Online (Sandbox Code Playgroud) 我正在编写一个 MFC 项目,该项目尝试调用 DLL 中的函数,该函数将以字符串形式返回一些信息。DLL中的函数如下:
int GetInfo(char* Info)
Run Code Online (Sandbox Code Playgroud)
如果成功,该函数将返回 0。信息将在字符串参数中返回。调用例程如下:
typedef int (WINAPI *FUNC1)(char* szInfo);
HINSTANCE hinstLib;
FUNC1 GetInfo;
char szInfo[50];
hinstLib = LoadLibrary(TEXT("DevInfo.dll"));
// If the handle is valid, try to get the function address.
if (hinstLib != NULL)
{
GetInfo = (FUNC1) GetProcAddress(hinstLib, "GetInfo");
// If the function address is valid, call the function.
if (NULL != GetInfo)
{
if((GetInfo) (szInfo)) // Error here!!
{
AfxMessageBox(_T("Error Reading"));
}
}
FreeLibrary(hinstLib);
}
Run Code Online (Sandbox Code Playgroud)
此代码在编译和链接时没有错误。执行时,会在上述位置返回“访问冲突执行位置0x00000000”的错误。任何人都可以建议吗?
这是我的 DLL 代码:
#include <Windows.h>
#include <iostream>
int sysLol(char *arg);
int sysLol(char *arg)
{
std::cout<<arg<<"\n";
return 1;
}
Run Code Online (Sandbox Code Playgroud)
这是我的应用程序代码:
#include <Windows.h>
#include <iostream>
#include <TlHelp32.h>
#include <stdlib.h>
typedef int (WINAPI* Lol)(char* argv);
struct PARAMETERS
{
DWORD Lol;
};
int main()
{
PARAMETERS testData;
HMODULE e = LoadLibrary(L"LIB.dll"); //This executes without problem
if (!e) std::cout<<"LOADLIBRARY: "<<GetLastError()<<"\n";
else std::cout<<"LOADLIBRARY: "<<e<<"\n";
testData.Lol = (DWORD)GetProcAddress(e,"sysLol"); //Error 127?
if (!testData.Lol) std::cout<<testData.Lol<<" "<<GetLastError()<<"\n";
else std::cout<<"MESSAGEBOX: "<<testData.Lol<<"\n";
std::cin.ignore();
return 1;
}
Run Code Online (Sandbox Code Playgroud)
所以,我的 LIB.dll 使用 成功加载LoadLibrary(),但 …
我们的 Android 应用程序遇到了一个奇怪的问题。在 Fabric 中,我们很少发生崩溃。这是一个标准的 UnsatisfiedLinkError ,意味着在 Java 类的静态初始化程序中,.so 库无法加载。这是我们迄今为止所发现的:
这个问题非常罕见。它发生在数十万台设备中的几百台设备中。
一旦出现这种情况,似乎重启甚至重新安装都不能解决问题。
这种情况发生在索尼、三星、华为等各个品牌上。
从 2.3 到 5.x 的所有 Android 版本都会出现这种情况。
我们在办公室的 Nexus 1 设备上成功捕获了它。当它开始发生时,它总是在 LoadLibrary 调用中失败,即使同一个 apk 在其他设备上运行得很好。
问题发生的时候,我把armv7a和x86版本的lib都去掉了,只留下了armeabi的,以排除加载错误的lib,还是失败。通过Android studio重新运行应用程序多次添加日志仍然导致在同一个地方失败。
然后突然间,在没有明显变化的情况下,它开始在 Nexus 1 中工作,甚至在重试数十次之后,我们无法再次重现该问题。在它开始工作之前发生的唯一一件事是,我尝试使用 adb install 手动安装损坏的 apk,但失败了,下次我通过 Android studio 加载该应用程序时,它工作了,并且从那以后一直工作。我不确定损坏的 apk 安装失败是否以某种方式清除了某些内容,或者这只是一个巧合。
我未能做的事情是检查发生故障时设备上的 lib 文件夹中是否确实存在armeabi .so 文件。我是在它已经开始工作之后才开始考虑这个问题的。
所以,总结一下。该 apk 完全没问题,但可以在 99.9% 的设备上从 Android studio 和 Play 商店安装,但在某些情况下(非常罕见),LoadLibrary 会失败,当失败时,似乎没有明显的修复方法,甚至重新安装都没有解决这个问题,但正如我所解释的,某些东西终于发生了变化,当它开始在 Nexus 1 上工作时,它从那时起就一直继续工作。
这个问题确实很棘手,因为我们现在无法重现它,而且我们知道它至少影响了一小部分用户。
欢迎任何有关如何缩小范围的建议。
我不明白为什么我无法使用 LoadLibrary 加载我的 dll“接口”。加载依赖项时似乎失败了,但我不确定为什么。
这是代码:
AfxMessageBox(L"before load library");
HMODULE interfacDll = LoadLibrary(TEXT("C:\\QA\\Pcdlrn\\Win32\\Release\\INTERFAC.DLL"));
if (!interfacDll)
DWORD dw = GetLastError(); // returns 0xc1 (193)
AfxMessageBox(L"after load library");
Run Code Online (Sandbox Code Playgroud)
这是 gflags (x86) 加载器快照的输出:
18a0:2a40 @ 06858973 - LdrGetDllHandleEx - ENTER: DLL name: ntdll.dll DLL path: NULL
18a0:2a40 @ 06858973 - LdrGetDllHandleEx - INFO: Locating DLL ntdll.dll in path C:\QA\Pcdlrn\CNCSERVER\Win32\Release;C:\Windows\system32;C:\Windows\system;C:\Windows;C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\NativeBinaries\x86;C:\windows\system32;C:\windows;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows
18a0:2a40 @ 06858989 - LdrpFindLoadedDll - ENTER: DLL name: ntdll.dll DLL …Run Code Online (Sandbox Code Playgroud) 如何从内存中卸载DLL.我使用FreeLibrary但它仍然加载
HINSTANCE hGetProcIDDLL = LoadLibrary("path.dll");
f_funci func = (f_funci)GetProcAddress(hGetProcIDDLL, "method");
int x = func();
FreeLibrary(hGetProcIDDLL);
Run Code Online (Sandbox Code Playgroud)
我曾经UnmapViewOfFile和FreeLibraryAndExitThread内存,但它仍然太
假设我们有两个动态库libfoo.dll和libbar.dll,鉴于这libbar.dll取决于libfoo.dll。此外,我们编译一个可执行文件test.exe,加载我们libbar.dll使用的 WinAPI 函数LoadLibrary()。
如果我们text.exe在 Windows XP 上运行missing libfoo.dll,则LoadLibrary()显示对话框警告而不是libfoo.dll实际丢失并设置LastError为ERROR_MOD_NOT_FOUND(126)。
如果我们text.exe在相同条件下在 Windows 10 上运行相同,LoadLibrary()设置LastError为ERROR_MOD_NOT_FOUNDonly,则不会出现对话框。
在这两种情况下ErrorMode都是 0。那么是否有可能在LoadLibrary()调用过程中捕获缺少依赖项的名称,或者至少,如何 LoadLibrary()在 Windows 10 上显示错误对话框?
这是一个示例代码(使用 MinGW):
int foo(int a, int b)
{
return a + b;
}
Run Code Online (Sandbox Code Playgroud)
编译: gcc foo.c -o libfoo.dll -fPIC -shared
int foo(int …Run Code Online (Sandbox Code Playgroud) loadlibrary ×10
dll ×6
c++ ×4
winapi ×3
android ×2
android-ndk ×2
c ×2
delphi ×1
delphi-xe2 ×1
matlab ×1
memory ×1
mfc ×1
pointers ×1
windows ×1
windows-10 ×1