我首先要说的是我非常喜欢编程菜鸟。我不了解IDE的所有编译器选项或细微差别,而不是远视。但我正在尝试更多地了解本机编程语言。 (我对C#很不错,但是我发现它比C < 更容易。)
今天,我用C编写了这个小程序。它是一个控制台/命令行程序。我使用Visual Studio 2012,我的开发机器在Windows 7和8,64位之间交替使用。首先,我所做的是创建一个新的VC ++项目,然后我选择了一个空白项目。然后我创建了一个新的app.c文件。我还创建了一个* .rc文件,当您在Windows资源管理器中浏览文件属性时,为可执行文件提供一些额外的属性,如“文件版本”和“公司名称”。然后我去了项目的属性,选择了Configuration Properties - &gt; C / C ++ - &gt;代码生成和我将运行时库更改为“多线程(/ MT),这样我就不必将msvcr100.dll文件与我的可执行文件一起分发。
在app.c文件中,我放置了以下代码:
#include <stdio.h>
#include <string.h>
#include <Windows.h>
#include <WtsApi32.h>
#pragma comment(lib, "WtsApi32.lib")
void main(int argc, char *argv[])
{
char *helpMsg = "blah";
char *hostName, *connState = "";
char *addrFamily = "";
HANDLE hHost = NULL;
...stuff and so forth and so on...
}
然后我构建/编译了程序,并且可执行文件在Windows 7,8,Server 2008R2,Server 2012,所有64位上运行正常。但是当我尝试在Server 2003上运行该程序时(我也猜测WinXP等),我对Windows的对话框表示欢迎:
“Foo.exe不是有效的Win32应用程序。”
所以我的问题是,是否有一些显而易见/简单的东西,我将丢失,这将允许这个可执行文件也可以在我错过的早期XP / 2003 / 32bit平台上工作?我不相信我在我的程序中使用任何64位独占功能。但我认为,因为我选择“空白项目”而不是“Win32控制台应用程序”,我可能会错过一些设置。
编辑:这是针对我的exe运行时的dumpbin.exe / headers输出:
Microsoft (R) COFF/PE Dumper Version 11.00.50727.1
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file C:\users\me\Release\foo.exe
PE signature found
File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
14C machine (x86)
5 number of sections
50F604BC time date stamp Tue Jan 15 19:39:08 2013
0 file pointer to symbol table
0 number of symbols
E0 size of optional header
102 characteristics
Executable
32 bit word machine
OPTIONAL HEADER VALUES
10B magic # (PE32)
11.00 linker version
7800 size of code
A200 size of initialized data
0 size of uninitialized data
16A7 entry point (004016A7) _mainCRTStartup
1000 base of code
9000 base of data
400000 image base (00400000 to 00414FFF)
1000 section alignment
200 file alignment
6.00 operating system version
0.00 image version
6.00 subsystem version
0 Win32 version
15000 size of image
400 size of headers
0 checksum
3 subsystem (Windows CUI)
8140 DLL characteristics
Dynamic base
NX compatible
Terminal Server Aware
100000 size of stack reserve
1000 size of stack commit
100000 size of heap reserve
1000 size of heap commit
0 loader flags
10 number of directories
0 [ 0] RVA [size] of Export Directory
D374 [ 3C] RVA [size] of Import Directory
11000 [ 538] RVA [size] of Resource Directory
0 [ 0] RVA [size] of Exception Directory
0 [ 0] RVA [size] of Certificates Directory
12000 [ C04] RVA [size] of Base Relocation Directory
9160 [ 38] RVA [size] of Debug Directory
0 [ 0] RVA [size] of Architecture Directory
0 [ 0] RVA [size] of Global Pointer Directory
0 [ 0] RVA [size] of Thread Storage Directory
CF98 [ 40] RVA [size] of Load Configuration Directory
0 [ 0] RVA [size] of Bound Import Directory
9000 [ 118] RVA [size] of Import Address Table Directory
0 [ 0] RVA [size] of Delay Import Directory
0 [ 0] RVA [size] of COM Descriptor Directory
0 [ 0] RVA [size] of Reserved Directory
SECTION HEADER #1
.text name
7670 virtual size
1000 virtual address (00401000 to 0040866F)
7800 size of raw data
400 file pointer to raw data (00000400 to 00007BFF)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
60000020 flags
Code
Execute Read
SECTION HEADER #2
.rdata name
49E2 virtual size
9000 virtual address (00409000 to 0040D9E1)
4A00 size of raw data
7C00 file pointer to raw data (00007C00 to 0000C5FF)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
40000040 flags
Initialized Data
Read Only
Debug Directories
Time Type Size RVA Pointer
-------- ------ -------- -------- --------
50F604BC cv 61 0000CFE0 BBE0 Format: RSDS, {582D0FF2-59C1-4633-AF2A-E4A4AD6BFA2C}, 1, C:\Users\me\Release\users.pdb
50F604BC feat 10 0000D044 BC44 Counts: Pre-VC++ 11.00=0, C/C++=116, /GS=116, /sdl=0
SECTION HEADER #3
.data name
2C04 virtual size
E000 virtual address (0040E000 to 00410C03)
E00 size of raw data
C600 file pointer to raw data (0000C600 to 0000D3FF)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
C0000040 flags
Initialized Data
Read Write
SECTION HEADER #4
.rsrc name
538 virtual size
11000 virtual address (00411000 to 00411537)
600 size of raw data
D400 file pointer to raw data (0000D400 to 0000D9FF)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
40000040 flags
Initialized Data
Read Only
SECTION HEADER #5
.reloc name
235C virtual size
12000 virtual address (00412000 to 0041435B)
2400 size of raw data
DA00 file pointer to raw data (0000DA00 to 0000FDFF)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
42000040 flags
Initialized Data
Discardable
Read Only
Summary
3000 .data
5000 .rdata
3000 .reloc
1000 .rsrc
8000 .text
我也试过去Project Properties - &gt;链接器 - &gt;系统:最低要求版本并将其更改为5.00和1.00或其他,但它没有任何效果。 dumpbin.exe仍然将操作系统版本报告为6.00。我甚至在exe上使用了editbin.exe / version 5.00并且没有报告错误...但是dumpbin.exe仍然报告操作系统版本为6.00。
答案 0 :(得分:7)
VS2012最初发货时没有支持XP / 2003。更新的CRT和运行时支持库使用的太多Windows api函数在这些操作系统上不可用。这引起了客户的极大轰动,温和地说,并且他们重新设计了库以动态地绑定到这些功能并且沿着它们跛行它们是缺失的。这在Update 1中可用,您需要使用Project + Properties,General,Platform Toolset = v110_xp来构建使用这些库的程序。
请注意它如何更改链接器设置,重要的是链接器&gt;系统&gt;最低要求版本=“5.01”。这确保可执行文件被标记为与XP子系统版本兼容。您还将针对SDK版本7.1进行构建,最后一个版本仍与XP兼容。
当您使用默认工具集(v110)时,您将定位子系统6.00和SDK版本8.版本6.00是最后一个主要内核版本,从Vista开始。
新的api函数的简要概述用于向您(非常粗略地)了解XP版本中缺少的内容:
答案 1 :(得分:4)
我自己想通了。 (但是谢谢Hans让我指导正确的方向。)出于某种原因,即使使用Update 1,甚至在将我的工具集设置为v110_xp之后,和在Linker选项中将所需的最低版本设置为5.01 ,生成的dumpbin app.exe /headers
仍然报告最低操作系统版本6.0。
所以我只是跑了
editbin.exe app.exe /SUBSYSTEM:CONSOLE,5.01 /OSVERSION:5.1
现在可执行文件在较旧的操作系统上运行正常。我想在Visual Studio中某处可能还有一点点bug。
答案 2 :(得分:2)
MSVC Team Blog表示当使用命令行中的MSBuild或DEVENV与v110_xp平台工具集时,不需要进行其他更改。此信息不正确/不完整。还必须适当地设置/ SUBSYSTEM链接器参数和关联的“Minimum Required Version”。
/ENTRY的MSDN文档指出,如果未指定/ SUBSYSTEM参数,则自动确定SUBSYSTEM和ENTRY POINT。我的预感是,当发生这种情况时,SUBSYSTEM的“最低要求版本”参数也会被自动覆盖。
v110_xp工具集自动指定SUBSYSTEM的MRV(“5.1”(WindowsXP)),但不指定SUBSYSTEM。因此,例如,链接器将覆盖MRV到“6.0”。然后运行该应用程序将导致WindowsXP显示错误消息,指出该应用程序“不是有效的Win32应用程序。”