【发布时间】: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