2

我有一个使用发布配置使用MSVC2005编译的.exe 。问题是当我将此.exe分发给其他人时,他们会收到以下消息:

"This application could not be started, because the application configuration is incorrect. In order to solve the problem you should reinstall the application."

我给了他们vcredist.exe,它解决了这个问题。但是,我想知道为什么这只发生在某些PC上?到目前为止,我有 1 台 PC 无法运行 .exe ,另一台可以运行.exe。两者都安装了相同的应用程序。可以运行我的.exe的电脑安装了msvcr80.dll,不能运行的电脑没有msvcr80.dll。

有谁知道为什么某些PC没有安装msvcr80.dll ?由于两台 PC 都安装了相同的操作系统和应用程序。

是否有一些工具可以检查哪个应用程序正在使用哪个 dll?

4

4 回答 4

1

有谁知道为什么某些PC没有安装msvcr80.dll?由于两台 PC 都安装了相同的操作系统和应用程序。

Windows 没有预装任何版本的 C 运行时库。C 运行时库可以由运行 vcredist 的人安装,也可以通过安装依赖于它并在其自己的安装程序中包含它的副本的应用程序来安装。

仅仅因为您正在查看的两台 PC 安装了相同的应用程序并不意味着它们具有相同的安装历史。也许一台 PC 安装了一个包含运行时库的应用程序,然后卸载了该应用程序,但该库被留下了。

如果您尝试分发依赖于 C 运行时库(或 redist 包中的另一个库)的应用程序,您的选择是:

  1. 要求您的用户获取并安装 vcredist。
  2. 包含必要库的副本并将其安装在与可执行文件相同的目录中。
  3. 链接到运行时库的静态副本。
  4. 在您的 .MSI 安装程序中包含运行时库合并模块,如果它尚未安装在公共位置,它将安装运行时库。

是否有一些工具可以检查哪个应用程序正在使用哪个 dll?

Visual Studio 曾经附带一个名为depends.exe 的工具,该工具检查可执行文件或DLL 并传递查找它需要的所有DLL。不再支持此工具,因为它在较新版本的 Windows 中不具有“并排”安装功能。但我相信有一个免费(开源?)版本的depends.exe 可用。

如果您只想知道某个特定的可执行文件是否直接依赖于 DLL,您可以使用 dumpbin,这是 Visual Studio 中包含的命令行工具。如果使用dumpbin /imports myapp.exe,您可以看到它所依赖的所有 DLL(但不一定是那些 DLL 所依赖的 DLL)。

于 2012-11-01T17:41:23.847 回答
1

如果某些计算机已经安装了使用 msvc 2005 构建的程序,那么您的 exe 副本就可以工作。我不认为任何版本的操作系统都预装了 msvc 可再发行组件。

如果在应用程序运行时您想知道它是否使用特定版本的 msvc 运行时,您可以使用进程资源管理器 - 一种 Microsoft 工具,以尽可能多地显示有关进程的信息。

于 2012-11-01T08:30:36.040 回答
0

静态链接 C 运行时是解决此问题的另一种方法。下面是如何做到这一点:静态链接

于 2012-11-01T17:28:11.967 回答
0

回复“是否有一些工具可以检查哪个应用程序正在使用哪个 dll?” 读这个。提供 vcredist.exe 解决了这个问题,因为他们的系统中没有安装 Microsoft Visual C++ 2010 Redistributable Package (x86)/最新版本。可以从微软官网下载。另外,如果您对命令行感兴趣,可以查看命令tasklist

于 2012-11-01T04:46:29.270 回答