Articles of DLL

在Windows上embeddedPython:为什么它必须是DLL?

我正在尝试编写一个embeddedPython的软件插件。 在Windows上,插件在技术上是一个DLL(这可能是相关的)。 Python Windows FAQ说: 1. 不要直接将Python构build到您的.exe文件中。 在Windows上,Python必须是一个DLL来处理导入本身就是DLL的模块。 (这是第一个关键的无证事实。)而是,链接到pythonNN.dll; 它通常安装在C:\ Windows \ System中。 NN是Python版本,如Python 2.3中的“23”。 我的问题是为什么Python必须是DLL? 如果在我的情况下,主机应用程序不是一个.exe,但也是一个DLL,我可以build立Python到它? 或者,也许,这个说明意味着第三方C扩展依靠pythonN.N.dll存在,而其他的DLL不会呢? 假设我真的想要一个DLL,我该怎么办? 我看到有dynload_win.c文件,它似乎是在Windows上导入C扩展的模块,并且据我所见,它扫描扩展文件以find它导入的pythonX.X.dll ; 但我没有经验的Windows,我不太了解所有的代码。

从dll导出函数指针

我有一个DLL文件中的函数指针(在实现,而不是标题)。 如何在EXE源代码中调用该指针指向的函数?

java,System.loadlibrary(“someDLLFile”)得到不满意的链接错误

我已经写了一些JNI钩子到C ++库中,并为我的java服务器项目创build了一些DLL文件。 比方说,DLL和jar文件在“C:/ server”下的同一个文件夹中 我正在访问这些DLL文件使用: System.loadLibrary("someDLLFile"); 在需要C ++代码的类中。 我遇到的问题是当我在自己的机器上运行此服务器时,无论我在哪里放置“服务器”文件夹,一切工作正常。 但是当我把它交给一个同事去testing的时候,他们不断地得到: java.lang.UnsatisfiedLinkError no someDLLFile in java.library.path 我想让DLL文件和jar文件在同一个文件夹中,并且不希望有人configuration他们的PATHvariables。 为什么System.loadLibrary()在我自己的机器上工作而不pipe文件夹的位置,而不是在另一台计算机上?

为什么不从入口函数调用FreeLibrary?

我正在写一个DLL需要多次dynamic调用一个单独的DLL。 我想保持被调用者加载,然后卸载它,当我的DLL被卸载。 但根据微软的说法,这是一个坏主意 。 入口点函数只应执行简单的初始化任务,不应该调用任何其他的DLL加载或终止函数。 例如,在入口点函数中,您不应该直接或间接调用LoadLibrary函数或LoadLibraryEx函数。 此外,当进程正在终止时,您不应该调用FreeLibrary函数。 这是有问题的代码。 有人可以解释为什么我不应该从DLL的入口点调用LoadLibrary和FreeLibrary? BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_DETACH : if (hLogLib != NULL) FreeLibrary(hLogLib); break; } return TRUE; }

Qt错误:未find过程条目

我正在Qt 5.6.1中做一个项目。 当我在Qt Creator中运行它时,它运行完美。 但是当我在文件夹中运行它时,它显示: 程序入口点?0QVariant @@ QAE @ ABVQString @@@ Z不能位于DLL Qt5Core.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 。