我有一个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"似乎正常工作.
LoadLibrary 函数返回错误代码 182。来自 MSDN:
ERROR_INVALID_ORDINAL: "操作系统无法运行 %1"
有没有人对这个错误有更好的描述?
我的.Net程序使用fortran Dll来执行数学函数(Arpack,解决本征模式).我相信fortran包含静态变量,通常不是线程安全的.此外,它非常复杂,可能需要花费大量精力才能使其保持线程安全.Dll不是很大(700K)所以我只想加载它多次(比如4或8)以允许线程同时工作.任何人都知道我该怎么做?我听说LoadLibrary在多次调用时总会返回相同的句柄.因此,我认为唯一的解决方案是在磁盘上安装我的Dll的多个副本(Arpack1.dll,Arpack2.dll等)并根据需要加载它们.太可怕了.
有任何想法吗?
尤安
我正在尝试加载我使用独立 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
我有一个加载插件的工作程序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
标记的文件标记为不可移植,但并未提示我正在尝试做的替代方案.PEB
是BeingDebugged
和SessionId
,加上一些字节数组 - 不是一个好兆头.ReservedN
如何枚举插件的地址范围,或者测试指针是否在插件中,或者确定指针指向哪个插件?
我正在编写一个 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()
,但 …
我想我已经对此进行了充分的研究,但没有找到可接受的答案。首先是大招: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。但是,这似乎不可行。
是否有捷径可寻?
谢谢!担
如何从内存中卸载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_FOUND
only,则不会出现对话框。
在这两种情况下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 ×7
c++ ×5
winapi ×3
c ×2
.net ×1
android ×1
android-ndk ×1
exception ×1
memory ×1
mfc ×1
process ×1
qt ×1
windows ×1
windows-10 ×1