Articles of LoadLibrary

有没有更好的方式来加载在C + +的DLL?

现在我做这样的事情,如果我有很多我想在我的DLL中引用的函数,它似乎很混乱。 有没有一种更好,更干净的方式来访问函数,而不必为每个函数定义创build一个typedef,以便它将编译和正确加载函数。 我的意思是函数定义已经在.h文件中,我不应该重新声明他们后我加载函数(或我?)有没有比使用LoadLibary更好的解决scheme? 如果在Visual Studio 2005项目设置中可以做同样的事情,我不一定需要这个function。 BHannan_Test_Class.h #include "stdafx.h" #include <windows.h> #ifndef BHANNAN_TEST_CLASS_H_ #define BHANNAN_TEST_CLASS_H_ extern "C" { // Returns n! (the factorial of n). For negative n, n! is defined to be 1. int __declspec (dllexport) Factorial(int n); // Returns true iff n is a prime number. bool __declspec (dllexport) IsPrime(int n); } #endif […]

C ++ LoadLibrary ERROR_NOACCESS“访问内存位置无效”。

好的,所以我有一种情况,在我写的DLL上调用LoadLibrary 。 这个对LoadLibrary的调用返回错误#998,或者ERROR_NOACCESS “对存储器位置的访问无效”。 有问题的DLL在一个configuration中使用MFC,而不是在另一个configuration中; 只有MFCconfiguration有这个问题。 它曾经工作 ,但我不知道我改变了什么:我实际上移动到非MFC版本,并已经修补了很多,我不知道我可以做什么,影响了MFC版本。 我不太了解DLL。 原来的加载代码实际上是给我的,我没有改变它。 以下是该代码: // submodule loading #ifndef MFC // Project uses standard windows libraries, define an entry point for the DLL to handle loading/unloading BOOL WINAPI DllMain(HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved) { _MESSAGE("DllMain called."); switch(dwReason) { case DLL_PROCESS_ATTACH: // dll loaded hModule = (HMODULE)hDllHandle; // store […]

依赖于其他DLL的插件DLL

我正在编写一个DLL来插入另一个(第三方)应用程序。 该DLL将需要依赖另一组DLL(由于许可证原因,我不能静态链接)。 我想我的DLL是“xcopy-deployable”到任何目录。 我也不想要求将这个目录添加到path中。 如果我用通常的方法构buildDLL,Windows将拒绝加载DLL,因为它无法在当前进程旁边findDLL。 有没有什么好的select来帮助WindowsfindDLL? 回答一些问题: 该DLL是用C ++编写的。 额外的DLL是QT-dll。 我想将额外的DLL放在与我的插件DLL相同的文件夹中。 我可以从GetModuleFileName获取该文件夹的名称。 该应用程序是Firefox,该DLL是一个PKCS#11安全模块。 应用程序使用DL​​L的完整path加载DLL(用户在安装插件时提供它)。 要求将DLL放在System32中或应用程序旁边就可以工作,但这有点麻烦,可能会导致卸载程序出现问题。 LoadLibrary和GetProcAddress当然会起作用,但在我的情况下并不可行。 我在其他DLL中使用了数百个(如果不是数千个)方法。 我真的需要使用导入库。 我曾想过在DllMain中使用延迟加载的dll和SetDllDirectory 。 有没有人尝试过这样的事情?

Windowspath在带有清单的LoadLibrary中search

如果你没有path调用LoadLibrary (例如, LoadLibrary("whatever.dll") ,Windows通常会遵循其标准的searchalgorithm,它是用来findEXE的。 我的问题是这样的:假设一个应用程序清单指定了一个特定版本的系统DLL,比如comctl32.dll 6.0。 在这种情况下, LoadLibrary("comctl32.dll")会立即转到正确的并排文件夹,还是执行某种search?

我如何直接从内存中执行代码在Delphi中?

是否有可能模仿loadlibraryfunction? 我想从BLOB字段中加载一个库,而不先写入临时文件,而且我需要一个不依赖于特定版本的delphi编译器或windows的解决scheme,并且不会触发防病毒软件。

在Windows下dynamic加载的库的地址范围

我有一个工作程序,加载LoadLibrary插件。 新的要求:在代码的某一点,我给了一个指针,我需要testing这个指针是指向代码还是插件的静态数据。 bool is_pointer_into_plugin(void *p, HMODULE h); 等价地,我需要检索指针指向的插件(如果有的话)。 我还需要知道指针是指向主程序的代码还是静态数据(最好是区分只读区域和读写区域)。 HMODULE plugin_containing_pointer(void *p); 等同地,我需要能够检索插件映射的范围(地址和大小)。 我也需要这个主要程序的信息。 我如何实现is_pointer_into_plugin ,或者plugin_containing_pointer ,或者其他什么东西? 如有必要,我可以更改对LoadLibrary的调用。 查找应该尽可能快,加载时间代码不需要很快。 在单独的进程中运行插件并通过共享内存进行通信不是一种select。 该程序必须运行在Windows XP和以上(和Linux,但这是另一个问题 )。 我需要的信息或多或less是Sysinternals公用事业listdlls报告的,所以我试图找出它是如何实现的。 我看到了使用NtQueryInformationProcess来检索链接到LDR_DATA_TABLE_ENTRY的PEB结构的LDR_DATA_TABLE_ENTRY 。 看起来很有希望,但是: 我可以看到一个DllBase ,看起来它可能是每个DLL的起始地址(是吗?),但没有大小。 NtQueryInformationProcess的文档将NtQueryInformationProcess标记为不可移植的,但是并不表示我正在尝试做什么。 在我的系统中, PEB中唯一的字段是BeingDebugged和SessionId ,加上一些Reserved N字节数组 – 不是一个好兆头。 我如何枚举插件的地址范围,或testing一个指针是否在一个插件,或确定一个指针指向哪个插件?

来自另一个DLL的LoadLibrary

在MSDN中描述的DLL查找path是: 当前进程的可执行模块所在的目录。 当前目录。 Windows系统目录。 GetSystemDirectory函数检索此目录的path。 Windows目录。 GetWindowsDirectory函数检索此目录的path。 PATH环境variables中列出的目录。 这带来了以下疑问: 假设我在某个目录下有一个可执行文件,例如: c:\execdir\myexe.exe ,它会加载一个在PATHfind的DLL,位于c:\dlldir\mydll.dll 。 现在,假设mydll.dll尝试使用LoadLibrary加载另一个DLL。 首先查看哪个目录 – c:\dlldir或c:\execdir ? 我认为上面引用的查询规则说它将会是c:\execdir因为这被称为“当前进程的可执行模块所在的目录”,但是从另一个来源获得确认将是很好的。 编辑:另外,是c:\dlldir\ 在所有看 ? 毕竟,它既不是.exe所在的位置,也不是“当前目录”(如果这是一般意义上的)。 PS我对Windows XP和7都感兴趣。

检测DLL的卸载

我有一个特殊的要求,我相信没有其他办法,那就是:检测DLL的卸载。 我search了一下,发现了一个四年的SO 。 我select了相同的解决scheme:钩免费库。 当代码进入MyFreeLibrary ,我将以同样的方式挂钩指定模块的入口点(内联钩子)。 而在MyEntryPoint ,我将首先调用原始入口点,然后检查reason参数 – 如果值等于DLL_PROCESS_DETACH ,则意味着该DLL的清理工作刚刚完成,并且将从地址空间中卸载。 在这一点上,我有机会做我的工作。 有用。 就是这样了 ? 不幸的是,它还没有完成。 一个非常重要的事情被忽视:依赖。 例如, a.dll链接对b.dll和c.dll 。 加载a.dll , b.dll和c.dll将首先被加载(被初始化)。 这是因为b.dll和c.dll在c.dll的导入表中a.dll ,它们是a.dll依赖关系。 同样,卸载a.dll ,如果引用计数减less到零, b.dll和c.dll也可能会被卸载。 我不知道有关加载程序如何发现DLL的依赖关系并将其卸载的详细信息, FreeLibrary的MSDN页面没有提到这一点,我很高兴明白这一点,但是我没有find信息。 所以主要的问题是如何检测卸载DLL模块的依赖关系。 我想有同样的机会去做我的工作。 一个可能的解决scheme可能是导入表,从它的导入表中找出一个DLL的依赖关系,并从它们的导入表中找出依赖关系的依赖关系,找出所有依赖关系,钩住所有入口点,不知道,这听起来很疯狂,我需要一些build议。

LoadLibrary静态/全局和线程

假设我有一个具有以下静态/全局的DLL: ClassA Object; 除了ClassA的实现之外,它还包含一个“常规”的ClassB,如果ClassA还没有被构造,这将不能正常工作(这就是为什么我使ClassA成为静态/全局的原因)。 在Windows中,我相信DLL加载器会在调用ClassB的构造函数时加载这个DLL,对吗? 此时,ClassA将被build造,然后ClassB的build设将随之而来。 如果第二个线程出现并构造ClassB,ClassA将不会被构造,因为它已经被构造了。 现在,我的问题是 – 如果ClassB是由两个线程同时构build的。 所以线程1将开始构buildClassA。 在执行ClassB的构造函数之前,线程2是否等待ClassA完全构造? 换句话说,LoadLibrary()是否使用CriticalSection来确保DLL的静态/全局variables的线程安全的初始化? 我的直觉是'是',但我似乎无法find任何文件说某种方式或其他。

抑制LoadLibrary中的错误

我试图摆脱加载DLL时有时popup错误消息。 我试图做到以下几点: UINT oldErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS); SetErrorMode(oldErrorMode | SEM_FAILCRITICALERRORS); LoadLibrary(myDll); SetErrorMode(oldErrorMode); 但是我仍然得到错误窗口,我试图加载几个DLL,以确保他们不删除SerErrorMode(),所以情况并非如此。 有没有人有一个想法还有什么我可以尝试? 谢谢