Articles of DLL

如何select应用程序应链接到的VC 2008 DLL的版本?

我正在使用C ++的Visual Studio 2008 SP1。 编译时,Visual Studio需要select与应用程序链接的版本的CRT和MFC DLL,版本9.0.21022.8(= RTM),9.0.30729.17(= SP1)或9.0.30729.4148(=安全更新的SP1) 。 我想知道如何select哪个版本将链接。 有人知道吗? 注意 :使用私有程序集时 ,这一点很重要,因为您需要知道要将哪些版本的VC 9.0 DLL与.exe一起复制。 请注意 ,_BIND_TO_CURRENT_VCLIBS_VERSION标志只能确保清单中包含正确的版本。 运行时的DLL版本select显然不是基于清单文件中包含的版本来完成的。 即使清单文件说应该使用v21022,.exe也使用v30729 .DLL。 我知道这一点,因为它使用std :: tr1 :: weakptr,这是不存在于v21022。

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 […]

在Visual Basic 6中访问dynamic加载的DLL(使用LoadLibrary)

我有一个需要创build一个DLL的包装,根据需要加载和卸载(对于这个问题的背景感兴趣,请参阅如何解决由Tomcat应用程序访问内存泄漏第三方DLL(无源代码)? )。 我在Visual Basic 6中完成,并使用下面的示例加载和卸载: Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long Private Sub cmdTestLoadingDLL_Click() Dim lb As Long, pa As Long lb = LoadLibrary("D:\projects\other\VB_DLLs\TestDLL\TestDLL.dll") Msgbox "Library address: " + lb FreeLibrary lb End Sub 我可以看到使用Process […]

是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 。 对我来说,第一个看起来是最简单的,因为这是一个普遍的需求,有很多网页解释如何去做。 你将如何处理这个?