私は非常にプログラミングの初心者であると言って始めなければなりません。私は、ロングショットではなく、IDE のすべてのコンパイラ オプションまたはニュアンスを理解していません。しかし、私はネイティブ プログラミング言語についてもっと独学しようとしています。(私は C# に慣れていますが、私が発見したように、それは C よりもはるかに簡単です。)
今日、私はこの小さなプログラムを C で書きました。これは、コンソール/コマンド ライン プログラムです。私は Visual Studio 2012 を使用し、開発マシンは Windows 7 と 8、64 ビットを交互に使用しています。まず、新しい VC++ プロジェクトを作成し、空のプロジェクトを選択しました。次に、新しい app.c ファイルを作成しました。また、*.rc ファイルを作成して、Windows エクスプローラーでファイルのプロパティを参照するときに、「ファイル バージョン」や「会社名」などの追加のプロパティを実行可能ファイルに与えます。次に、プロジェクトのプロパティに移動し、[構成プロパティ] -> [C/C++] -> [コード生成] を選択し、ランタイム ライブラリを「マルチスレッド (/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/32 ビット プラットフォームでも動作することを可能にする、私が見逃している明白/単純なものはありますか? 私は自分のプログラムで 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 -> Linker -> System: Minimum Required Version に移動して、それを 5.00 および 1.00 などに変更しようとしましたが、効果はありません。dumpbin.exe はまだ OS バージョンを 6.00 として報告します。exeで editbin.exe /version 5.00 を使用したこともあり、エラーは報告されませんでした...それでも、dumpbin.exeはOSバージョンとして6.00を報告します。