【问题标题】:Visual Studio 2010 Win32 App won't start on Windows XPVisual Studio 2010 Win32 应用程序无法在 Windows XP 上启动
【发布时间】:2012-02-25 20:23:28
【问题描述】:

我必须编写一个具有一些特定要求的简单应用程序:
1. 它应该只包含一个 exe 文件,没有安装程序或外部 DLL
2. 应该很小
3. 它应该可以在任何 Windows (Win32) 平台上运行(至少在 Windows XP 上),无需对 Windows 安装进行任何修改(不依赖于 .NET、JVM、MFC 或 Visual Studio 可再发行组件)
4. 它应该有一个简单的(基于对话框的)用户界面

我决定用 C (C++) 编写一个简单的 Win32 应用程序,只使用标准的 win32 api,没有花哨的东西。我在 64 位 Windows 7 上使用 Visual Studio 2010 创建了项目,并将运行时库从多线程 DLL 更改为仅多线程。我认为这会产生最兼容 Windows 的应用程序。

编译后的应用程序在我的 Windows 7 上运行良好,但我无法在任何 Windows XP PC 上启动它。我在 Windows XP SP2 和 SP3 上都试过了。奇怪的是我在活动管理器中没有收到任何错误消息并且没有恶意进程,当我双击 exe 文件时没有任何反应。并且没有生成 DrWatson 日志。

我已经在项目设置中检查了目标机器,它是 MachineX86。

我在这个问题上搜索了很多,一个提示是修改 targetver.h,但我没有结果。这就是我的 targetver.h 现在的样子:

#include <WinSDKVer.h>
#define _WIN32_WINNT      _WIN32_WINNT_WINXP
#include <SDKDDKVer.h>

我也尝试过依赖walker,但它只显示一个名为DWMAPI.DLL 的延迟加载DLL 并出现错误,这似乎是一个Vista DLL。还有另外两个延迟加载的 DLL,MPR.DLL 和 SHLWAPI.DLL 的警告。但由于它们是延迟加载的,而且我认为我没有在其中使用任何东西,所以这无关紧要(谷歌搜索表明这些警告应该被忽略)。

我的目标是能够编译一个可以在 XP 机器上运行的 exe,而无需对其进行任何修改。

【问题讨论】:

  • 你能做一个“dumpbin /imports yourapp.exe”(其中“yourapp.exe”是你的EXE名称)吗?这可能会提供一些关于缺少哪些 DLL 的提示。此外,系统事件日志通常会包含有关进程无法启动的原因的一些信息。
  • 这应该可以。你没有分享任何代码,所以很难猜出哪里出了问题。您是否尝试过构建一个与 VC 运行时静态链接的简单“hello world”控制台应用程序(如上所述)。那运行失败吗?完全有可能您的程序在 XP 上运行良好……但您可能有一个“错误”导致它中止或在 XP 上不显示任何内容。你试过用调试器在 XP 上调试你的 EXE 吗?
  • 您是否尝试过使用空应用程序?只是基本的 win32 gui 模板应用程序。
  • 感谢所有提示。我查看了事件日志,但从我尝试启动我的应用程序开始就没有任何条目。我尝试构建默认模板 Win32 应用程序,它确实在 Windows XP 上成功启动。我会尝试遵循 selbie 的提示并使用 dumpbin。

标签: c++ visual-studio-2010 winapi windows-xp


【解决方案1】:

我解决了这个问题。当我说我是用普通的 Win32 做的,没有花哨的东西时,这并不完全正确。在现代操作系统上运行时,我不希望 XP 之前的外观和感觉过于繁琐,因此我将这些行添加到 stdafx.h(按照我在网上找到的提示):

#define ISOLATION_AWARE_ENABLED 1
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

我没有提到这一点的原因是我已经尝试删除这些行,但它仍然不起作用(我仍然无法理解为什么当我删除这些行时它不起作用,我尝试了不止一次)。

但是在阅读了更多 MSDN 文章后,我发现这些行需要在 windows.h 的包含之前,所以我移动它,现在它可以工作(经典和 xp 风格)

所以问题似乎是我在 windows.h 的包含错误的一侧更改为 ComCtl32 的版本 6,但我仍然不知道为什么当我删除这些行时它不起作用。 Windows 会以某种方式缓存清单吗?

【讨论】:

    【解决方案2】:

    尝试创建一个静态链接到 C 运行时库的程序。

    在您的解决方案中的项目中执行以下操作:转到属性 |配置 | C/C++ |代码生成 |运行时库。

    版本:将 /MD 更改为 /MT,多线程。 调试:将 /MDd 更改为 /MTd,调试多线程。

    如果您想继续使用动态链接,请按照@dbrank() 的建议将 MSVC++ 运行时文件复制到您的 XP 机器中。但是,您在原始帖子中声明您想要一个独立的 .exe,不需要复制额外的文件。

    【讨论】:

      【解决方案3】:

      也许你在 XP 机器上需要这个:MSVC 2010 runtime

      【讨论】:

      • 这是我的第一个猜测.. 但他说:“并将运行时库从多线程 DLL 更改为只是多线程”。他正在静态链接。
      • 啊,我错过了。我仍然会安装它。只是为了排除可能性,这里包含的一些库不是静态链接的。
      猜你喜欢
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 2015-09-03
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 2013-05-15
      相关资源
      最近更新 更多