Articles of LoadLibrary

如何从Linux上的.so文件中获取C ++类?

我正在使用ACE库来做一些反应器工作。 在linux上,默认的ACE编译输出是libACE.so。 我通常使用-lACE编译选项来编译它,但这取决于我是否已经在ld.so.conf.d目录中configuration了libACE.conf。 如果我想子类ACE_Task,可以从ACE.so导入,编译依赖于libACE.so,如果我想dynamic加载ACE.so,我该怎么做? 我试过了,如果我使用dlopen,那么会出现链接错误。 那么,有没有办法dynamic加载ACE.so,仍然可以像这样实现ACE_Task? class test: public ACE_Task<ACE_MT_SYNCH> { }

Octave能以matlab的方式调用外部库(二进制)吗?

我正在考虑将我的一些matlab(在windows上)应用程序移植到linux上,应用程序集成在Windows上的matlab中,它会调用一些外部库例程(我的意思是DLL,而不是.mex文件),这是matlab的calllib例程。 然而,由于昂贵的许可证费用,我想将这个端口转移到Linux中的Octave,我只是想确保Octave可以像Matlab一样处理外部二进制库(我的应用程序很less使用matlab工具箱,所以缺less某些工具箱在八度不应该是我的问题)。

LoadLibrary不重用加载的库

我的目录结构如下: test dir a.dll <– version 1 a.dll <– version 2 myapp.exe 我希望LoadLibrary("dir\\a.dll")使用版本1,而LoadLibrary("a.dll")将使用版本2,同时: LoadLibrary("dir\\a.dll"); LoadLibrary("a.dll"); 根据LoadLibrary的文档,两者都将引用版本1。 但是,当我尝试在应用程序中这样做时, 第1行加载版本1,第2行加载第2版。 我试图写一个小的复制器,但在复制器中按预期工作 – 所以有一些在较大的应用程序或在加载的DLL中打破。 有什么可以导致的,我该如何解决呢? 而要强调的是,这两个负载在较大的应用程序中是相邻的,在第1行和第2行之间没有系统调用(当然也是相同的过程)。 我原本想在它们之间插入很多代码,但是看到这个问题,甚至在它们相邻的时候也转载了它。 我也尝试了以下的目录结构: test dir a.dll <– version 1 myapp.exe Windows System32 a.dll <– version 2 但是,第1行加载版本1,第2行加载版本2。

如果你给它一个已经静态链接到的DLL的名字,LoadLibrary会做什么?

在Windows上,如果你给它一个你的可执行文件已经静态链接(又名隐式链接)的DLL的名字,LoadLibrary会做什么? 将两个DLL的副本加载? 如果DLL的path名是原始的某种别名呢? 例如,假设我将可执行文件作为X:\myprog\myexe.exe ,并隐式链接到X:\ myprog \ mydll.dll,但是我将LoadLibrary \\the\unc\path\to\X\myprog\mydll.dll 。 LoadLibrary足够聪明,可以解决这些问题到同一个DLL吗?

COM对象DLL负载问题

我正在使用一个Qt DLL作为一个大型应用程序的插件。 这个DLL依赖于可悲的不在同一文件夹中的其他DLL,因此只有在当前工作目录已经正确设置(大型应用程序在调用DLL上的LoadLibrary之前所做的工作目录)的情况下才会加载该DLL。 我无法控制这种行为。 我被要求添加一个简单的COM对象到我已经完成的这个插件,但是现在我的问题是DLL不能被第三方应用程序注册或使用,除非当前的工作目录设置正确 – 因为任何LoadLibrary调用在插件失败,由于缺less依赖关系。 很显然,我无法控制第三方应用程序使用的当前工作目录,在这个阶段,我不允许修改PATH以确保可以find依赖关系。 我已经尝试使用/DELAYLOAD为依赖的DLL,但是由于导入数据符号…'错误无法延迟加载foo.dll。 再次,我不能轻易改变这些依赖DLL的使用方式。 目前我认为唯一的解决scheme是将COM对象移动到一个独立的DLL,它不依赖于任何东西,但我有压力find解决scheme,并将COM对象留在插件DLL中。 我不明白这是怎么可能的,所以我想我会看看其他人是否有任何想法。 某种forms的系统范围的SetDllDirectory调用会帮助或某些registry破解,当第三方应用程序在我的插件上调用LoadLibrary时,可能会设置工作目录。

安全的地方把不安全的DLL清理代码在Windows上?

我们遇到了一个情况,那就是将FreeLibrary调用放到DllMain / DLL_PROCESS_DETACH是最好的解决scheme。 当然,你不能这样做 : 从DllMain调用FreeLibrary是不安全的。 用例是我们有这样的情况: (unknown client dll or exe) links dynamically or statically to -> -> DLL_1, loads dynamically -> DLL_x DLL_1应该透明地加载DLL_x。 到它的客户端代码,它应该dynamic加载DLL_x。 现在,加载可以被懒惰地完成,所以LoadLibrary调用不需要驻留在DLL_1的DLL_PROCESS_ATTACH部分。 但是,一旦客户端完成了DLL_1,在DLL_1从进程中卸载之前,它也应该卸载(== FreeLibrary)DLL_x。 有没有办法做到这一点,而不必显式的DLL_1/Uninitialize函数,必须由客户端调用? 我会注意到: DllMain ,因此也不能使用任何C ++全局静态析构函数。 在kernel32 / ntdll中,还是在共享的MS CRT中,是否还有其他callback机制来实现这一点? 还有其他的模式,使这个用例工作?

LoadLibrary似乎加载了错误的DLL

我在Windows上的LoadLibrary有一个奇怪的问题。 首先是一些背景。 这个应用程序依赖于Qt,而Qt被分成几个库。 我正在尝试升级Qt版本,但没有打破任何人。 较新的Qt库与旧版本是向后兼容的。 这意味着使用较旧版本构build的应用程序可以在加载较新版本的情况下运行。 相反是不正确的 – 如果较旧版本的应用程序已加载,则使用较新版本构build的应用程序将会丢失符号。 Qt DLLs是特定于版本的目录(例如c:\qt\qt-4.5.2\lib和c:\qt\qt-4.8.1\lib )。 还有一个共同的目录,大多数开发者在其PATH中包含我们使用的所有第三方库(称为c:\common\lib )的“当前”版本。 这是运行应用程序时通常会findQt库的地方。 我把新的Qt版本库放在公共位置,除了一种情况,一切似乎都正常。 有问题的应用程序分为多个库,其中一些通过调用LoadLibrary()加载。 一些这些运行时加载的DLL依赖于Qt库。 在一种情况下,加载的DLL依赖于QtXml ,它本身依赖于QtCore 。 这是奇怪的地方。 一个应用程序依赖于QtCore ,并加载一个依赖于QtXml的库。 应用程序和库build立了与旧版Qt的链接。 如果这个应用程序只用PATH中的公共目录运行,那么所有的东西都可以工作,因为新的Qt版本DLL是从公共目录加载的。 但是,如果PATH包含在公用目录之前存储旧Qt版本DLL的目录,则加载运行时DLL失败并丢失符号。 (这种情况出现在进行自动unit testing时,脚本明确地将PATH设置为使用特定的库版本。) 就我QtCore.dll ,应用程序正在加载旧版本的QtCore.dll ,运行时加载的DLL(以某种方式)加载了新版本的QtXml.dll ,由于已加载的QtCore没有符号需要。 但这似乎是不可能的,因为PATH是类似于c:\qt\qt-4.5.2\lib;c:\common\lib (加上其他不相关的path)。 如果我从公共lib目录中删除较新的QtXml (不是用旧版本replace它,只是删除它),那么LoadLibrary()成功,因为它加载了所有Qt库的4.5.2版本。 但是这不是一个好的长期解决scheme,因为在PATH(common)中运行没有Qt特定的版本目录将无法findQtXml 。 这怎么可能? LoadLibrary() (或者任何它以recursion方式调用来解决库的依赖性)如何从PATH 稍后加载库? 我找不到任何可能表明公共库目录被特别考虑的事情(它不是一个设置的DLL目录)。 在构build过程中没有提到,这只是开发人员为了方便而在PATH一些东西。 顺便说一句,类似的情况存在于LD_LIBRARY_PATH和dlopen() Linux上,它在那里工作得很好。 这是Windows做的不同,我不明白。 有没有人有任何洞察什么可能会出错?

与mylibrary.dll_unloaded BEX64错误

我有一个可执行文件,dynamic地用LoadLibrary打开一个DLL(mylibrary.dll)。 当应用程序完成时,它崩溃。 探索错误报告,事实certificate,它提供了一个事件typesBEX64。 其中一个参数是mylibrary.dll_unloaded。 其余的是一堆地址。 有人知道这是什么意思,可能的问题来源是什么? 我可以访问涉及的所有代码的来源。

在同一个进程中加载​​一组DLL的多个副本

背景 我正在维护一个应用程序的插件。 我使用Visual C ++ 2003。 这个插件是由几个DLL组成的 – 这里有主DLL,应用程序使用LoadLibrary加载的DLL,主DLL和其他DLL使用了几个实用程序DLL。 依赖通常看起来像这样: plugin.dll – > utilA.dll,utilB.dll utilA.dll – > utilB.dll utilB.dll – > utilA.dll,utilC.dll 你得到的照片。 DLL之间的一些依赖关系是加载时间和一些运行时间。 所有的DLL文件都存储在可执行文件的目录中(不是必需的,现在它是如何工作的)。 问题 有一个新的要求 – 在应用程序中运行插件的多个实例。 应用程序在其自己的线程中运行插件的每个实例,即每个线程调用由plugin.dll导出的函数。 然而,插件的代码不是线程安全的 – 大量的全局variables等等。 不幸的是,修复整个事情目前还不是一个选项,所以我需要一种方法来在同一个进程中加载​​多个(最多3个)插件DLL的副本。 选项1:独特的名称方法 创build每个DLL文件的3个副本,以便每个文件具有不同的名称。 例如plugin1.dll,plugin2.dll,plugin3.dll,utilA1.dll,utilA2.dll,utilA3.dll,utilB1.dll等。该应用程序将加载plugin1.dll,plugin2.dll和plugin3.dll。 这些文件将在可执行文件的目录中。 对于每个DLL组通过名称相互了解(所以相互依赖关系都起作用),编译时需要知道名称 – 这意味着DLL需要多次编译,每次只能使用不同的输出文件名。 不是很复杂,但我讨厌有3个VS项目文件的副本,不喜欢不得不反复编译相同的文件。 选项2:并排组装方法 创buildDLL文件的3个副本,每个组在其自己的目录中,并通过将程序集清单文件放在目录中,将每个组定义为程序集,列出插件的DLL。 每个DLL将有一个指向程序集的应用程序清单,以便加载程序find驻留在相同目录中的实用程序DLL的副本。 清单需要被embedded,以便在使用LoadLibrary加载DLL时find它。 因为VS2003没有内置清单embedded支持,所以我将使用VS的更高版本中的mt.exe。 我已经尝试了部分成功的方法 – 依赖关系在DLL的加载时发现,而不是当加载另一个DLL的DLL函数被调用时。 这似乎是根据这篇文章预期的行为 – 一个DLL的激活上下文只用于DLL的加载时间,然后它被停用,并使用进程的激活上下文。 编辑:按预期的方式与ISOLATION_AWARE_ENABLED使用 – […]

为什么不是一个完整的文件path需要加载一个DLL? 在什么情况下这个function是有益的?

为什么Windows在调用LoadLibrary或者CLSID w / registered DLL等时不需要完整的文件path?在某些情况下,某人会从DLLsearch顺序上退缩以find一个dll? 我的意思是,像%SystemRoot%或%ProgramFiles%这样的variables可以让你到合适的文件夹,而。\会把你留在当前的目录中。那么为什么要模糊呢?