标签: loadlibrary

LoadLibrary失败:第一次机会异常0xC0000139(找不到DLL) - 如何调试?

我有一个dll"mytest.dll",当加载via时LoadLibrary(),返回NULL(和127作为GetLastError()).如果我在"mytest.dll"上使用DependencyWalker,它会报告它应该正确加载并且正确找到所有DLL.在主机exe上运行DependencyWalker的探查器选项为我提供了日志中的相关部分:

00:00:55.099: Loaded "mytest.DLL" at address 0x07860000 by thread 0xBBC.  Successfully hooked module.
00:00:55.115: First chance exception 0xC0000139 (DLL Not Found) occurred in "NTDLL.DLL" at address 0x76E24285 by thread 0xBBC.
00:00:55.115: Unloaded "mytest.DLL" at address 0x07860000 by thread 0xBBC.
00:00:55.115: LoadLibraryW("mytest.dll") returned NULL by thread 0xBBC. Error: The specified procedure could not be found (127).

有没有办法调试这个来找出NTDLL.DLL报告试图查找的DLL Not Found消息?或者我应该在其他地方寻找问题的根源?

请注意,从另一个应用程序加载相同的"mytest.DLL"似乎正常工作.

c++ dll exception loadlibrary

5
推荐指数
1
解决办法
2万
查看次数

ERROR_INVALID_ORDINAL 究竟是什么意思?

LoadLibrary 函数返回错误代码 182。来自 MSDN:

ERROR_INVALID_ORDINAL: "操作系统无法运行 %1"

有没有人对这个错误有更好的描述?

dll winapi loadlibrary

5
推荐指数
1
解决办法
3884
查看次数

多次加载Dll以允许.Net中的多线程

我的.Net程序使用fortran Dll来执行数学函数(Arpack,解决本征模式).我相信fortran包含静态变量,通常不是线程安全的.此外,它非常复杂,可能需要花费大量精力才能使其保持线程安全.Dll不是很大(700K)所以我只想加载它多次(比如4或8)以允许线程同时工作.任何人都知道我该怎么做?我听说LoadLibrary在多次调用时总会返回相同的句柄.因此,我认为唯一的解决方案是在磁盘上安装我的Dll的多个副本(Arpack1.dll,Arpack2.dll等)并根据需要加载它们.太可怕了.

有任何想法吗?

尤安

.net multithreading loadlibrary

5
推荐指数
1
解决办法
4510
查看次数

Android 加载原生库

我正在尝试加载我使用独立 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

android loadlibrary android-ndk

5
推荐指数
1
解决办法
3万
查看次数

Windows下动态加载的库的地址范围

我有一个加载插件的工作程序LoadLibrary.

新要求:在代码中的某个时刻,我给了一个指针,我需要测试这个指针是否指向插件的代码或静态数据.

bool is_pointer_into_plugin(void *p, HMODULE h);
Run Code Online (Sandbox Code Playgroud)

同样地,我需要检索指针所指向的插件(如果有的话).我还需要知道指针是指向主程序的代码还是静态数据(理想情况下,区分只读区域和读写区域).

HMODULE plugin_containing_pointer(void *p);
Run Code Online (Sandbox Code Playgroud)

同样,我需要能够检索插件映射的范围(地址和大小).我还需要这个主程序的信息.

我该如何实现is_pointer_into_plugin,或者plugin_containing_pointer等同于什么?

LoadLibrary如有必要,我可以更改电话.查找应该尽可能快,加载时代码不需要很快.在单独的进程中运行插件并通过共享内存进行通信不是一种选择.该程序必须在Windows XP及更高版本上运行(和Linux,但这是另一个问题).

我需要的信息或多或少是Sysinternals实用程序listdlls报告的内容,所以我试图找出它是如何实现的.我看到了一个建议使用的NtQueryInformationProcess检索PEB其链接到一个结构LDR_DATA_TABLE_ENTRY.看起来很有希望但是:

  • 我可以看到一个DllBase看起来可能是每个DLL的起始地址(是吗?),但没有大小.
  • NtQueryInformationProcess标记的文件标记为不可移植,但并未提示我正在尝试做的替代方案.
  • 在我的系统中,唯一的字段PEBBeingDebuggedSessionId,加上一些字节数组 - 不是一个好兆头.ReservedN

如何枚举插件的地址范围,或者测试指针是否在插件中,或者确定指针指向哪个插件?

c windows dll process loadlibrary

5
推荐指数
1
解决办法
240
查看次数

0xC0000005:访问冲突执行位置0x00000000

我正在编写一个 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”的错误。任何人都可以建议吗?

c++ mfc loadlibrary getprocaddress access-violation

5
推荐指数
1
解决办法
4万
查看次数

GetProcAddress() 失败,错误 127

这是我的 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(),但 …

c++ dll loadlibrary getprocaddress

5
推荐指数
1
解决办法
2万
查看次数

如何防止特定的DLL加载到我的进程中

我想我已经对此进行了充分的研究,但没有找到可接受的答案。首先是大招:Windows 8.1,Visual Studio2013。尽管如此,我认为这些都不重要。

问题如下。我正在编写的应用程序使用A.dll。我们使用第三方供应商产品(备份程序,但这并不重要),该产品已在HKEY_CLASSES_ROOT \ Directory \ shellex \ ContextMenuHandlers下安装了上下文菜单处理程序控件。假设它的路径是c:\ Program Files \ Vendor \ control.dll。

现在的问题是,当我的程序打开一个文件选择器对话框时(这是一个使用QFileDialog的Qt程序,然后使用标准的Windows),该控件被加载以提供上下文相关的右键单击功能。此控件取决于“ A.dll”的不同版本,并且在加载control.dll时,我的程序立即崩溃。

我不需要这个额外的功能。我想做的是防止在我的进程中加载​​此特定的dll(control.dll)。在面向对象的世界中,我将简单地重载LoadLibrary(),检查该特定的DLL,然后以其他方式调用标准的DLL。但是,这似乎不可行。

是否有捷径可寻?

谢谢!担

c++ dll winapi qt loadlibrary

5
推荐指数
1
解决办法
1848
查看次数

如何在C++中从内存中卸载DLL?

如何从内存中卸载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)

我曾经UnmapViewOfFileFreeLibraryAndExitThread内存,但它仍然太

c++ memory dll loadlibrary

5
推荐指数
1
解决办法
8790
查看次数

缺少依赖项时如何使 LoadLibrary 显示错误对话框

假设我们有两个动态库libfoo.dlllibbar.dll,鉴于这libbar.dll取决于libfoo.dll。此外,我们编译一个可执行文件test.exe,加载我们libbar.dll使用的 WinAPI 函数LoadLibrary()

如果我们text.exe在 Windows XP 上运行missing libfoo.dll,则LoadLibrary()显示对话框警告而不是libfoo.dll实际丢失并设置LastErrorERROR_MOD_NOT_FOUND(126)。

如果我们text.exe在相同条件下在 Windows 10 上运行相同,LoadLibrary()设置LastErrorERROR_MOD_NOT_FOUNDonly,则不会出现对话框。

在这两种情况下ErrorMode都是 0。那么是否有可能在LoadLibrary()调用过程中捕获缺少依赖项的名称,或者至少,如何 LoadLibrary()在 Windows 10 上显示错误对话框?

这是一个示例代码(使用 MinGW):

foo.c

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)

c dll winapi loadlibrary windows-10

5
推荐指数
1
解决办法
1320
查看次数