我在WindowsXP上编写了一个大型而复杂的C应用程序。现在我正在64位Windows7机器上重新编译。当我运行某些可执行文件时出现此错误:TheprogramcannotstartbecauseMSVCP71.dllismissingfromyourcomputer.Tryreinstallingtheprogramtofixtheproblem.显然,这是一个.dll,它曾经与Windows一起提供,但现在没有(特别参见这个MSDNforum和这个previousstackoverflow问题。)我应该从MicrosoftVisualC++生成这个DLL并“从合并模块中提取DLL
我使用的是同一供应商生产的两个商业库,分别称为VendorLibA和VendorLibB。这些库根据编译器版本(例如VC7、VC8)分发了很多DLL。这两个库都依赖于另一个由该供应商生产的库,称为VendorLibUtils并包含在一个DLL中。问题:VendorLibA使用的VendorLibUtils版本与VendorLibB不同。这两个版本不是二进制兼容的,即使它们是二进制兼容的,使用错误的版本也是一个坏主意。有什么方法可以在同一进程下使用这两个库吗?注意:LoadLibrary无法解决这个问题,因为我的进程不是导入VendorLibUtils的进程。编辑:忘了提显而易见的事情,
我有一个应用程序在Windows上使用LoadLibrary来动态加载插件。然而,一些插件有其他依赖的DLL,例如数据库客户端DLL。当您尝试加载此类DLL并且其中一个依赖的DLL不存在时,您会看到一个讨厌的Windows对话框:“该程序无法启动,因为您的计算机缺少xxx.ddl。请尝试重新安装该程序以解决此问题。”有什么简单的方法可以避免这个对话框吗?我希望有人可以使用LoadLibraryEx并传递一个标志,上面写着“不要给我那个烦人的对话框”,但它看起来不像。我希望应用程序处理该错误,而不是Windows为我处理它,尤其是当消息文本不正确时(问题不是程序无法启动,程序运行得很愉快
考虑以下理解32位进程无法加载64位dll,反之亦然。用于注册/注销DLLregsvr32在通过将目标DLL加载到其地址空间后调用入口点DllRegisterServer/DllUnregisterServer>加载库。在64位系统上,regsvr32的32位版本位于C:\Windows\SysWOW64但是在我的2008R2Box上,我能够通过64位regsvr32注册一个32位dll。这怎么可能?我错过了什么吗?我想在屏幕截图中突出显示的示例是弹出对话框的最后一个示例。 最佳答案 这应该可以准确解释它是如何发生的:(来源:ala
我想在不停止服务的情况下更新服务器进程的dll。我怎么做?有点像asp.net如何自动拾取放在bin文件夹中的新dll。 最佳答案 Asp.Net使用一种称为shadowcopy的技术如果将更新的dll复制到应用程序的bin子目录中,ASP.NET运行时会识别出有新代码要执行。由于ASP.NET无法将dll交换到现有的AppDomain中,因此它会启动一个新的AppDomain。旧的应用程序域是“drainstopped”,即允许现有请求完成执行,一旦它们全部完成,AppDomain就可以卸载。新的AppDomain以新代码开始并开
有没有办法以编程方式检测模块(特别是DLL)何时从进程中卸载?我没有DLL源代码,所以我无法更改它的DLL入口点。我也无法轮询当前是否加载了DLL,因为DLL可能会在轮询之间被卸载然后重新加载。结果:我最终使用绕过dll入口点并捕获DLL_PROCESS_DETACH的jimharks解决方案。我发现绕过FreeLibrary()也可以工作,但必须添加代码来检测模块何时实际卸载或引用计数是否正在减少。Necrolis关于查找引用计数的链接对于这样做的方法很方便。我应该注意到,如果MSDetours中存在绕行,我会遇到问题,它实际上没有从内存中卸载模块。 最佳
如果已编译的库中缺少C++运行时msvcr80.dll,是否有任何方法可以确定使用哪个版本创建该库或使其在更高版本的msvcr80.dll上运行? 最佳答案 VC80SP1CRT可再发行包将C运行时的RTM和SP1版本安装到%SystemRoot%\WinSxS(假设您使用的是WindowsXP或Vista;Windows2000不支持并排装配)。如果您安装了VC8,则CRT可再发行组件包位于%ProgramFiles%\MicrosoftVisualStudio8\VC\redist中。如果您没有安装VC8,我想您可以从Micro
我问是因为我注意到许多64位EXE链接到看似32位DLL的内容。例如,我的64位MFC应用程序链接到user32.dll、urlmon.dll、wininet.dll-所有这些都是驻留在windows\system32中的32位DLL。那么,这是适用于这些DLL的某些特定于MS的魔法吗?或者说,对于需要使用旧版32位DLL的64位EXE,是否存在向后兼容性? 最佳答案 您不能将64位EXE链接到32位DLL,反之亦然。在64位Windows操作系统上,Windows\System32中的DLL实际上是64位DLL。32位版本在Win
如何拦截dll方法调用?有哪些可用的技术?只能用C/C++完成吗?如何拦截所有正在运行的进程对给定dll的方法调用?如何拦截给定进程对给定dll的方法调用? 最佳答案 我可以想到两种标准方法来做到这一点DLL导入表钩子(Hook)。为此,您需要解析DLL的PEheader,找到导入表并写入您自己的函数的地址,而不是已经写入的地址。您可以保存原始函数的地址,以便以后调用它。此wikipediaarticle的外部链接中的引用应该会为您提供执行此操作所需的所有信息。直接修改代码。找到你想要Hook的函数的实际代码并修改它的第一个操作码以
我正在开发Rail3应用程序。经过几个小时的努力并最终在win7x64/ruby1.9.2上安装rmagick2.13.1gem而没有错误,我遇到了另一个错误。是的,我听说Windows中的Rails体验可能会很痛苦......我使用carrierwave处理图像并将其上传到AWSS3。处理看起来像classIconUploader[100,100]process:convert=>:png...当我在我的开发机器上触发文件上传时,它抛出一个窗口弹出窗口,说CORE_RL_magick_.dllnotfoundGoogle在这方面并没有真正提供帮助。我将我的PATH变量设置为C:/