C ++请求MSVCP110D.dll即使静态链接

时间:2017-01-04 18:51:54

标签: c++ windows winapi visual-c++

我在我的机器上用C ++创建了一个library注入方法,当我尝试将一个特定的dll注入一个进程时,它非常有效。但是,当我在我朋友的计算机上运行该程序时(其中未安装Visual Studio的可再发行组件),我被警告我需要MSVCR等...(可再发行组件)。

所以我使用Visual Studio 2012中的以下设置在release模式下编译:{{1​​}}。现在,当我在我的朋友那里运行它 机器我被警告我只需要库Runtime Library : Multi-threaded /MT(很奇怪,要求调试版本)(没有防病毒软件,UAC被禁用)。 我在发布路径中手动复制了所请求的库,但仍无法正常工作。

这是我制作的注射码:

MSVCP110D.dll

我在stackoverflow上找到了一些引用,但它们没有任何帮助。 喜欢 msvcp110.dll, how do I get around it?Fixing the "MSVCP110D.dll is missing from your computer" issue

3 个答案:

答案 0 :(得分:10)

  

很奇怪,要求调试版

告诉你你做错了什么,你不小心复制了DLL的Debug版本而不是Release版本。由于您只更改了发布版本的设置,因此仍需要msvcp110d.dll。通常,更改所有配置和所有平台的设置是明智的。单调乏味,所以经常会被跳过。

  

我在发布路径中手动复制了所请求的库,但仍无法正常工作

是的,自注入DLL以来,这是行不通的。一个不同的过程。因此,在加载时,会搜索游戏的安装目录以查找文件,而不是安装实用程序的目录。

答案 1 :(得分:3)

您的朋友需要Visual-C++ Redistributables才能正确运行您的注入器,以及加载DLL。的然而

注入后,dll正在尝试LoadLibrary(如果GetModuleHandle失败)CRT dll。它们中有很多!

你有一些选择:

  1. 在您的Injector(资源,字节码等)中包含所需的DLL,并将它们写入目录

  2. 从互联网上的服务器下载DLL并将其放在目录中运行游戏

  3. 静态链接CRT(注入的DLL)也有效,但你必须确保你也得到所有的依赖!

  4. 您需要在运行游戏的文件夹中包含所需的DLL的原因是因为LoadLibrary调用将从Game.exe本身明确发出,并且它只会查找该目录中的DLL。

    您可以选择将运行时调试程序(如WinDbg)附加到注入的DLL,在DLL入口点(无论您身在何处)设置断点。然后检查加载DLL时调用的LoadLibrary / GetModuleHandle调用类型,这将为您提供有关所需DLL的提示!

    这里的问题是因为你的朋友没有安装Visual-C++ Redistributables,许多CRT文件也有自己的依赖!您的注入器必须有一个Win-Installer,而Win-Installer又可以从Microsoft网站安装可再发行的MSI,这是一种适用于许多现代游戏(安装时)的技术。

答案 2 :(得分:2)

尝试按照项目设置进行操作

  1. C / C ++运行时库:多线程/ MT - 正如您已经拥有的那样。

  2. C / C ++代码生成 - >基本运行时检查 - >如果您的设置中还有其他内容,则为“默认”。

  3. 链接器 - >清单文件 - >生成清单“否”

  4. 清单工具 - >输入和输出 - >嵌入清单 - > “没有”。

    1. 在发布模式下重建您的应用程序并检查。
  5. 还使用和Check with Dependency walker查找哪个DLL链接到您的EXE“调试DLL”。