Articles of DLL

是0x0000ffff在Windows中的DLL的默认加载计数?

使用windbg,通过!dlls命令获得负载计数的dll列表。 观察到许多加载的dll的负载计数是0x0000ffff 。 这是一个默认值? 这是否意味着什么? 0x00262fa8: C:\WINDOWS\system32\ole32.dll Base 0x774e0000 EntryPoint 0x774fd0b9 Size 0x0013d000 Flags 0x80084006` LoadCount 0x0000ffff TlsIndex 0x00000000 LDRP_STATIC_LINK LDRP_IMAGE_DLL LDR**strong text**P_ENTRY_PROCESSED LDRP_PROCESS_ATTACH_CALLED

外部函数调用与多个依赖的DLL

我想从一个具有多个依赖DLL的DLL调用几个API。 我将所有DLL添加到安装程序包并定义了原型: function myapi_Init(): Integer; external 'myapi_init@A.dll stdcall setuponly loadwithalteredsearchpath delayload'; 我使用ExtractTemporaryFiles('*.dll')在InitializeSetup()提取所有DLL,然后尝试调用相应的API。 我得到一个运行时错误,无法导入DLL … 我重新定义了原型如下,并删除了调用来提取DLL: function myapi_Init(): Integer; external 'myapi_init@files:A.dll,B.dll,C.dll,D.dll,E.dll stdcall setuponly loadwithalteredsearchpath delayload'; 这工作正常。 我检查了两种情况下,所有合适的DLL都被提取出来并放在同一个地方。 我更喜欢第一种情况,因为它避免了拼出每个API的所有DLL名称。 我在第一种情况下做错了什么导致失败?

列出DLL的导出函数

我正在寻找一种方法(在C ++ / Windows中)使用dbgHelp列出DLL中的导出函数(甚至可能是未导出的方法)。 有谁知道哪种方法可以做到这一点? 谢谢 :)

C ++:从DLLdynamic加载类

对于我当前的项目,我希望能够从一个DLL(这不总是相同的,甚至可能不存在,当我的应用程序编译)加载一些类。 对于一个给定的类,也可能有多个可选的dll(例如Direct3D9和OpenGL的一个实现),但是任何时候只有一个dll会被加载/使用。 我有一组基类定义接口加上一些基本的方法/成员(即用于引用计数的)我想要加载的类,这些DLL项目然后从创build那里派生类。 //in namespace base class Sprite : public RefCounted//void AddRef(), void Release() and unsigned refCnt { public: virtual base::Texture *GetTexture()=0; virtual unsigned GetWidth()=0; virtual unsigned GetHeight()=0; virtual float GetCentreX()=0; virtual float GetCentreY()=0; virtual void SetCentre(float x, float y)=0; virtual void Draw(float x, float y)=0; virtual void Draw(float x, float y, float angle)=0; virtual […]

减lessWindows可执行文件的大小

我有一个Windows上的C + + / MFC应用程序 – dynamic链接它只有60kb静态它是> 3Mb。 这是一个通过电子邮件分发给客户,所以需要尽可能小。 它静态链接的MFC和MSCVRT库 – 因为它是一些问题的修复,我不想要更多的关于缺less库的支持调用 – 特别是非常有用的“应用程序configuration是不正确的”一个! 反正有剥离所有额外的MFC东西,这是DLL,但我不使用的Windows EXE的? 或者告诉它dynamic链接MSVCRT(它必须存在),但静态链接MFC DLL可能不是? 编辑 – 感谢,把它降到1.6Mb,将不得不做!

如何在C ++中构build运行时版本不可知的DLL?

我的产品是一个C ++库,在Windows上,它是作为一个DLL分发的。 它几乎不使用c运行时(基本的iostream,就是这样),所以我相信所有最新版本的CRT都可以。 由于我的客户应该使用我的dll来构build他的应用程序,所以我不想强加给他任何特定的运行时版本。 我想我的DLL绑定到我的客户端的应用程序正在使用的任何运行时库版本(我可以假设他将使用他的CRTdynamic链接)。 毕竟,这不是什么dynamic链接? 那可能吗? 编辑:链接DLL对静态运行库也将无法正常工作,因为那么静态运行时(从DLL)和dynamic运行时(从客户端的应用程序)将被混合,这是不好的。 编辑:我主要问的是我如何告诉运行时加载器链接我的dll与应用程序链接的任何CRT? 可能是与清单的东西? 更一般地说,我的问题是如何build立一个很好的行为的DLL,这是由客户使用build立他们自己的应用程序? 编辑:感谢在答案中的build议,我已经将所有对std类的引用转换为标题中的内联函数,并将我的dll与静态运行时库链接起来。 现在,即使在与不同CRT版本连接的应用程序中,它似乎也能工作

不同DLL的公共运行时

我需要构build一个能够在运行时加载其他DLL的DLL; 这些其他DLL与主DLL(这是Python和扩展)有一个相当密切的关系,所以它们必须有一个公共的运行时间。 主DLL 必须是可以简单地复制到目标机器上的单个文件。 辅助DLL将被放置在不同的目录中。 所以:“公共运行时”意味着没有静态链接; “单个文件+简单复制”排除了共享的MS可再发行组件,特别是与“不同的目录”结合在一起时。 我只看到以下选项:链接所有DLLs msvcrt.dll ; 将当前msvcrtXXembedded到主DLL中,并重新导出其所有符号; 使用主机应用程序的msvcrtXX 。 对我来说,第一个看起来是最简单的,因为这是一个普遍的需求,有很多网页解释如何去做。 你将如何处理这个?

函数没有在错误的DLL中find

我写了一个使用qt的Windows应用程序,它具有许多dll依赖项。 但是,当我把它移动到另一台机器,我开始得到“入口点@@ somethingsomething没有在avformat55.dll中find”的错误。 踢球者是,这个消息是正确的。 该函数根本不在该dll中,它完全不同,也在可执行文件的文件夹中。 为什么会在错误的地方searchfunction? 应该如何解决? 编辑:我已经交换了所有ffmpeg dll为x64系统build立的; 这导致程序无法以0xc000007bexception开始; 这可能与系统是64位有关。 编辑。 我在其他几台机器上尝试过二进制文件,同样出现了x64或x86的错误。 但是debugging版本可以正常工作,所以这是一个版本构build问题。 编辑:我的.pro文件 #————————————————- # # Project created by QtCreator 2013-05-17T10:55:01 # #————————————————- QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = LPR_Demo TEMPLATE = app # The application version VERSION = 1.0 # Define the preprocessor macro to get the […]

如何为现有的.exe,.dll设置版本信息?

作为我们构build过程的一部分,我需要为所有编译的二进制文件设置版本信息。 一些二进制文件已经有版本信息(在编译时添加),有些则没有。 我希望能够应用以下信息: 公司名 版权声明 产品名称 产品描述 文件版本 产品版本 所有这些属性都由构build脚本指定,并且必须在编译之后应用。 这些是用C ++ Builder 2007编译的标准二进制文件(不是程序集)。 我怎样才能做到这一点?

Windows的mallocreplace(例如,tcmalloc)和dynamic的crt链接

一个使用多个DLL和QT的C ++程序应该配备一个mallocreplace(如tcmalloc ),用于解决可由Windows malloc导致的性能问题。 有了linux,没有问题,但是使用windows,有几种方法,我觉得它们都没有吸引力: 1.将新的malloc放在lib中,并确保先链接(其他SO-问题) 这有一个缺点,例如, strdup仍然会使用旧的malloc,而且免费的可能会导致程序崩溃 。 2.使用lib.exe(Chrome)从静态libcrt库中删除malloc 这是铬/铬testing/使用(?),但有缺点,它只是与静态链接crt的作品。 静态链接有问题,如果一个系统库与msvcrtdynamic链接可能会在堆分配/取消分配不匹配 。 如果我的理解正确,tcmalloc可以被dynamic地链接起来,以便所有自编译的dll(这是很好的)有一个共同的堆。 3.补丁crt源代码(firefox) Firefox的jemalloc显然修补了Windows CRT源代码,并构build了一个新的crt。 这又是上面的静态/dynamic链接问题。 有人可能会想到使用它来生成一个dynamic的MSVCRT,但我认为这是不可能的,因为许可证禁止提供一个打补丁MSVCRT同名。 4.在运行时dynamic修补加载的CRT 一些商业内存分配器可以做这样的魔术。 tcmalloc也可以,但是这看起来相当难看。 它有一些问题,但他们已经修复。 目前,使用tcmalloc它不能在64位窗口下工作。 有更好的方法吗? 任何意见?