10

私は非常にプログラミングの初心者であると言って始めなければなりません。私は、ロングショットではなく、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を報告します。

4

3 に答える 3

7

VS2012 は、もともと XP/2003 をサポートせずに出荷されました。更新された CRT およびランタイム サポート ライブラリは、これらのオペレーティング システムでは使用できない Windows API 関数を使用しています。これは控えめに言っても、顧客の間でかなりの騒動を引き起こし、ライブラリを再設計して、これらの関数に動的にバインドし、不足している関数に沿って足を引きずりました。これはUpdate 1で利用可能になりました。これらのライブラリを使用するプログラムをビルドするには、Project + Properties、General、Platform Toolset = v110_xpを使用する必要があります。

リンカーの設定がどのように変更されるかに注意してください。重要なのは、[リンカー] > [システム] > [必要な最小バージョン] = "5.01" です。これにより、実行可能ファイルが XP サブシステム バージョンと互換性があることが保証されます。また、XP と互換性がある最後の SDK バージョン 7.1 に対してもビルドします。

デフォルトのツールセット (v110) を使用する場合、サブシステム 6.00 と SDK バージョン 8 をターゲットにします。バージョン 6.00 は、Vista 以降の最後の主要なカーネル リビジョンです。

XPバージョンに欠けているものを(非常に大まかに)理解するために使用されている新しいAPI関数の簡単な概要:

  • FlsAlloc、FlsFree、FlsGetValue、FlsSetValue : 安全なスレッド ローカル ストレージ
  • InitializeCriticalSectionEx、CreateSemaphoreEx : 安全性
  • SetThreadStackGuarantee : 安定性
  • CreateThreadPoolTimer、SetThreadPoolTimer、WaitForThreadPoolTimerCallbacks、CloseThreadPoolTimer : 安価なタイマー
  • CreateThreadPoolWait、SetThreadPoolWait、CloseThreadPoolWait : より安価な待機?
  • FlushProcessWriteBuffers、GetCurrentProcessorNumber、GetLogicalProcessorInformation : スレッド化
  • FreeLibraryWhenCallbackReturns : 安定性?
  • CreateSymbolicLink : 機能
  • InitOnceExecuteOnce : 不明
  • SetDefaultDllDirectories : 不明
  • EnumLocalesEx、CompareStringEx、GetDateFormatEx、GetLocalInfoEx、GetTimeFormatEx、GetUserDefaultLocaleName、IsValidLocaleName、LCMapStringEx : ロケール サポートの向上
于 2013-01-16T01:34:28.357 に答える
4

私は自分でそれを理解しました。(しかし、私を正しい方向に導いてくれた Hans に感謝します。) 何らかの理由で、Update 1 を使用し、ツールセットを v110_xp に設定し、リンカー オプションで必要な最小バージョンを 5.01 に設定した後でも、結果dumpbin app.exe /headersは依然として最小値を報告します。オペレーティング システム バージョン 6.0。

だから私はただ走った

editbin.exe app.exe /SUBSYSTEM:CONSOLE,5.01 /OSVERSION:5.1

また、実行可能ファイルは古いオペレーティング システムでも問題なく動作するようになりました。Visual Studio のどこかにまだ少しバグがあるのではないかと考えています。

于 2013-01-16T15:38:05.137 に答える