Vytváření 64-bitových aplikací ve Visual Studiu.NET 2003
Nedávno byla vydána 64-bitová verze Windows XP. Tento článek popisuje postup
jak nakonfigurovat Visual Studio.NET 2003 pro sestavení 64-bitové aplikace. Pokud máte nainstalováno
Visual Studio 2005, postup je trochu jednodušší a je popsán v revizi článku
1. 64bitový operační systém
Jako první krok by mělo být nainstalování operačního systému Windows XP 64-bit Edition.
Tento krok sice není nezbytný k sestavení 64-bitových aplikací (kompiler a linker jsou
32-bitové) ale aplikace nepůjde spustit.
2. 64bitové Platform SDK
Kompiler a linker ve VS.NET 2003 neumí sestavit EXE soubory pro 64-bitovou platformu.
Je proto třeba nainstalovat Platform SDK pro Windows Server 2003 SP1, který je k dispozici
ke stažení na webu Microsoftu.
Platform SDK nainstalujte na pevný disk s výchozími volbami, jako setup použijte "SetupA64.exe".
Tento článek předpokládá instalaci do adresáře D:\PSDK64, pokud si jej nainstalujete jinam,
budete muset upravit cesty uváděné dále v tomto článku.
3. Konfigurace Visual Studia.NET 2003
Před spuštěním VS.NET 2003 je potřeba nastavit cesty ke kompileru, linkeru, hlavičkovým souborům
a knihovnám z nainstalovaného Platform SDK. K tomu je nutné nastavení proměnných prostředí
ve vlastnostech počítače (My Computer\Properties\Advanced\Environment variables). Proměnné
nastavené instalátorem SDK nejsou nastaveny správně pro 64-bitovou platformu (aspoň podle mých zkušeností).
- Z proměnné PATH pro aktuálního uživatele odstraňte na všechny cesty týkající se
Visual Studia a Platform SDK. Pozor ať nesmažete některé proměnné týkající se jiných programů.
Na konec toho, co v proměnné zůstane, vepište "D:\PSDK64\Bin\Win64\x86\AMD64;D:\PSDK64\Bin;D:\PSDK64\Bin\WinNT".
- Proměnnou INCLUDE nastavte na "D:\PSDK64\Include;D:\PSDK64\Include\CRT;D:\PSDK64\Include\Mfc;D:\PSDK64\Include\Atl".
- Proměnnou LIB nastavte na "D:\PSDK64\Lib\amd64;D:\PSDK64\Lib\amd64\ATLMFC".
- Zkopírujte si zástupce pro Visual Studio.NET 2003 z nabídky Start a do pole "Target"
na konec přidejte přepínač "/useenv". Tento přepínač způsobí, že pro cesty k binárkám,
hlavičkám a knihovnám budou použity proměnné PATH, INCLUDE a LIB.
Poznámka: Pokud otevíráte projekty jako já poklepáním na .SLN soubor, musíte také upravit
záznam v registrech v HKEY_CLASSES_ROOT\VisualStudio.Solution.7.1\Shell\Open\Command.
jinak se bude Visual Studio startovat s předinstalovanou konfigurací pro 32-bitovou platformu.
- Spusťte Visual Studio.NET 2003 a v menu "Tools\Options\Projects\VC++ Directories zkontrolujte
zda jsou cesty, hlavičky a knihovny nastaveny správně.
4. Konfigurace projektu
Jako výchozí projekt jsem vzal existující projekt pro Win API (32-bit), což bude zřejmě nejčastější případ.
- Otevřete vlastnosti projektu (Menu "Project\Properties") a otevřete Configuration Manager.
- Z konfigurace Release vytvořte Release64. Jako platformu ponechte Win32, ve Visual Studio.NET
2003 není jiná možnost.
- Kategorie "General\Output Directory" a "General\Intermediate Directory" nastavte na ".\Release64"
- V kategorii "C/C++\General", volba "Debug Information Format" nesmí být "Program Database
for Edit and Continue".
- V kategorii "C/C++\General", volbu "Detect 64-bit Portability issues" nastavte na "Yes".
- V kategorii "C/C++\Preprocesor", v poli "Preprocessor definitions" změňte "WIN32" na "WIN64".
Poznámka: Symbol WIN32 zůstane i nadále definován !
- V kategorii "C/C++\Code generation", volbu "Basic Runtime Checks" nastavte na "Default".
- V kategorii "C/C++\Code generation", volbu "Runtime library" nastavte na "Multithreaded DLL".
- V kategorii "C/C++\Output Files" nastavte volby "ASM List Location", "Object File name"
a "Program Database File name" na ".\Release64/" (Pozor na lomítko na konci !)
- V kategorii "Linker\Input", do "Additional dependencies" přidejte "bufferoverflowu.lib".
- V kategorii "Linker\Advanced", nastavte volbu "Target Machine" na "Not set"
- V kategorii "Linker\Command line", přidejte "/MACHINE:AMD64".
- Smažte všechny adresáře "Debug", "Release" a "Release64" a sestavte projekt (Rebuild Solution).
Přesvědčte se, že kompiler ani linker nevytvořil jiný adresář kromě "Release64".
- Pokud máte v projektu přidaný manifest, zkontrolujte jej. V případě, že se v manifestu
vyskytuje konstrukce processorArchitecture="x86", tak ji nahraďte za
processorArchitecture="*". Jinak program nepůjde "z neznámých důvodů" spustit.
5. Odstranění chyb
Jakýkoliv větší projekt bude nutně obsahovat chyby, které vzniknou typovými rozdíly na 64-bitových
platformách. Množství chyb bude záviset na tom, jak precizně jste kód napsali. Velké množství
chyb je možné opravit už při kompilaci pro 32-bitovou platformu, pokud překládáte na Warning Level 4
a se zapnutou volbou "Detect 64-bit portability issues". Tato dvě nastavení ale vyžadují značnou dávku
masochismu, a programátoři často používají nižší úroveň warningů a detekci 64-bitové přenositelnosti
nechávají vypnutou.
Při kompilaci 64-bitové verze vás bude kompilátor nemilosrdně trestat za chyby jako např.:
- Přetypování pointeru nebo handlu na DWORD
- Použití funkce SetWindowLong nebo GetWindowLong
- Přiřazení výsledky funkce strlen() do proměnné typu int
6. ... no a konečně to můžeme spustit
Pokud jste bez újmy na zdraví překonali celý uvedený postup, můžete zkusit zkompilovanou aplikaci spustit.
Nezkoušejte to udělat v prostředí MSVC.NET 2003, 64-bitové aplikace nejsou podporovány.
Možná se setkáte s problémem, že není nalezena knihovna MSVCRTD.dll. Tu musíte společně s PDB soubory
nakopírovat do adresáře System32. Ačkoliv to vypadá jako vtip, ke kopírování do adresáře System32
musíte použít 64-bitovou aplikaci (Windows Explorer, ale ne např. Total Commander). Pokud neuposlechnete,
soubory budou nakopírovány do adresáře Windows\SysWOW64, kam jsou 32-bitové aplikace automaticky
přesměrovány pokud se pokusíte cokoliv provést v adresáři Windows\System32.
Pokud aplikaci spustíte, můžete se v Task Manageru přesvědčit, že opravdu jde o 64-bitovou aplikaci
(viz. obr.)
Copyright Ladislav Zezula 12.04.2005