Articles of DLL

通过dll边界传递对STL向量的引用

我有一个很好的库来pipe理需要返回特定的string列表的文件。 由于我将要使用的唯一代码将是C ++(和Java,但通过JNI使用C ++),我决定使用标准库中的向量。 库函数看起来有点像这样(其中FILE_MANAGER_EXPORT是平台定义的导出要求): extern "C" FILE_MANAGER_EXPORT void get_all_files(vector<string> &files) { files.clear(); for (vector<file_struct>::iterator i = file_structs.begin(); i != file_structs.end(); ++i) { files.push_back(i->full_path); } } 我使用vector作为引用而不是返回值的原因是为了保持内存分配的健全,并且因为windows对于c ++返回types有一个extern“C”真是不高兴(谁知道为什么,我的理解是所有的extern都是“ C“的作用是防止编译器中的名称混乱)。 无论如何,与其他c ++一起使用这个代码一般如下: #if defined _WIN32 #include <Windows.h> #define GET_METHOD GetProcAddress #define OPEN_LIBRARY(X) LoadLibrary((LPCSTR)X) #define LIBRARY_POINTER_TYPE HMODULE #define CLOSE_LIBRARY FreeLibrary #else #include <dlfcn.h> #define GET_METHOD dlsym #define […]

什么是REBASE.EXE的替代?

我需要重新绑定与我的程序一起安装的DLL文件组,因为这是一个32位程序,现在地址空间太碎了。 另外还有一个问题,就是在冷启动时需要将整个DLL分页到RAM中,这样加载器就可以将它们重新绑定,因为与某些DLL的基地址冲突。 有些DLL是我们编译的; 其他人来自第三方。 我想要做的是有一个工具重新绑定给定的一组DLL,这样的DLL组占用连续的内存块。 然后,这个工具将在编译安装程序之前运行,而重新发布的DLL将被安装在应用程序的专用目录中。 据我所知,Windows SDK附带的REBASE.EXE工具确实做到了。 给它一些DLL,并重新启动它们。 不幸的是… Windows 8 Consumer Preview的Windows软件开发工具包(SDK)说: 工具许多过时或已弃用的工具已从Windows SDK中删除。 以下工具已被删除: <snip> ReBase.exe 现在怎么办? 我不想开始使用显然已经过时的工具,它将在下一个版本的Windows中消失。 假设我正在阅读这个权利,什么是使用ReBase.exe的替代品? 我想限制自己使用Windows SDK和/或Visual Studio附带的工具,而不是引入第三方工具和/或编写自己的rebase代码。 或者,我以错误的方式接近整个问题?

在Win 8.1下,c ++ / cli DLL失败

我已经写了一个Win32 /净DLL,它在Win XP,Win7和8下工作正常,但在Win 8.1下失败。 依赖Walker说:找不到API-MS-WIN-CORE-KERNEL32-PRIVATE-L1-1-1.DLL(user32.dll会调用它们) 谷歌的意思是,MS在8.1版本中改变了一些系统DLL(并忽略了兼容性),所以很多程序都有同样的问题。 完整列表和“找不到文件”: API-MS-WIN-CORE-KERNEL32-PRIVATE-L1-1-1.DLL API-MS-WIN-CORE-PRIVATEPROFILE-L1-1-1.DLL MSVCR120.DLL API-MS-WIN-CORE-SHUTDOWN-L1-1-1.DLL API-MS-WIN-SERVICE-PRIVATE-L1-1-1.DLL EXT-MS-WIN-NTUSER-UICONTEXT-EXT-L1-1-0.DLL IESHIMS.DLL 有人有一个想法如何解决这个问题?

谁将堆分配给DLL?

假设我开发了一个DLL,使用MS Visual Studio 2005/2008来说1.dll,然后我把这个DLL链接到一个控制台应用程序,比如1.exe,在加载的时候(使用头文件和.lib文件)如果我在运行时分配内存,那么谁分配堆(免费存储)到DLL。 据我所知,DLL使用进程的地址空间的数据,代码和堆栈。

如何模仿静态库中的“应用程序内的全局variables的多个实例”行为,但使用DLL?

我们有一个用C / C ++编写的应用程序,它被分解成一个EXE和多个DLL。 这些DLL中的每一个都使用相同的静态库( utilities.lib )。 实用程序静态库中的任何全局variables实际上在应用程序的运行时都会有多个实例。 每个模块的全局variables(即DLL或EXE)将有一个utility.lib链接到的副本。 (这是众所周知的,但是值得深入探讨静态库在DLL上下文中的行为。 现在我的问题..我们要改变utilities.lib ,使它成为一个DLL。 它变得非常庞大和复杂,我们希望以DLLforms而不是.libforms分发它。 问题是,对于这个应用程序,我们希望保留当前的行为,即每个应用程序DLL都拥有公用程序库中全局variables的副本。 你怎么去做这个? 其实我们并不需要所有的全局variables,只有一些; 但是,如果我们能够得到它,那也无所谓。 我们的想法: 在我们关心的库中没有太多的全局variables,我们可以用一个访问器来包装每个variables,这个访问器会尝试找出哪个DLL正在调用它。 据推测,我们可以走上调用堆栈,并找出每个函数的HMODULE ,直到find一个不是utilities.dll 。 然后我们可以根据调用的DLL返回不同的版本。 在调用utilities.dll任何函数之前,我们可以要求调用者设置一个特定的全局variables(也可能是线程本地的)。 实用程序DLL然后可以使用此全局variables值来确定调用上下文。 我们可以find一些在运行时多次加载utilities.dll方法。 也许我们需要在构build时创build多个重命名的副本,以便每个应用程序DLL可以拥有它自己的实用程序DLL副本。 这首先否定了使用DLL的一些优点,但也有其他应用程序不需要这种“静态库”风格的行为,哪些仍然将受益于utilities.lib成为utilities.dll 。

Python将DLL复制到Windows上的站点包

我正在写一个需要链接到第三方DLL的Python扩展模块。 我怎么能复制这个DLL到site-packages目录使用distutils(即在我的setup.py文件)?

(静态链接的)DLL是否使用与主程序不同的堆?

我是Windows编程的新手,我刚刚“迷路”了两个小时,find了一个每个人似乎都知道的错误:你不能在一个DLL的堆中创build一个对象,并在另一个DLL(或主程序) 。 我几乎可以肯定,在Linux / Unix上,情况并非如此(如果是这样的话,请说出来,但是我敢肯定,我已经做了上千次,没有问题…)。 在这一点上,我有几个问题: 1)静态链接的DLL是否使用与主程序不同的堆? 2)静态链接的DLL是否映射到主程序的相同进程空间中? (我很确定这里的答案是一个大的YES,否则将主程序中的函数指针传递给DLL中的函数是没有意义的)。 我正在谈论普通/正规的DLL,而不是COM / ATL服务 编辑:“静态链接”我的意思是我不使用LoadLibrary加载DLL,但我链接到存根库

如何执行* .dll文件

我有一个DLL文件,并希望在Windows上执行它。 我从一个挑战网站获得这个DLL,声称该DLL应该独立执行。

微软的ASLR很奇怪

我观看了32位进程的ASLRed dll映像基地址。 这不是一个完全的随机化。 它只是随机化的1/2概率。 例如,一旦我加载一个DLL然后图像加载在0x12345678 。 我再次加载图像,图像加载在0x23456789上 (基地址被改变!) 但我再次加载图像 0×12345678 0x23456789 0×12345678 0x23456789 … 为什么他们这样执行? 是否为崩溃报告的频率?(为了获得重新部署的dll的相同崩溃地址)

RegSvr32退出代码文档?

我玩RegSvr32.exe注册一个COM服务器,并获得下一个退出代码: 0 – 正确注册正常的DLL Com服务器 3 – 尝试注册假DLL Com服务器(简单的文本文件重命名为.DLL 4 – 当尝试注册简单的DLL,而不是通讯服务器 问题:我可以在哪里find所有可能的退出代码及其含义的官方(或非官方的,但是很好的)描述? search在互联网上没有给我的结果,所以我发现这个主题写在退出代码是一样的Windows系统错误代码,但我不明白为什么然后当尝试注册坏文件我正在获取代码= 3 = ERROR_PATH_NOT_FOUND ,并注册非COM DLL时 – 4 = ERROR_TOO_MANY_OPEN_FILES ? 对我来说,这听起来不合逻辑。