2014-11-23 22 views
5

Chcę, aby mój program działał w trybie 32-bitowym, jeśli jest w 32-bitowym systemie operacyjnym lub w trybie 64-bitowym, jeśli jest w 64-bitowym systemie operacyjnym. Ten program jest tworzony z Bat To Exe Converter v2.1.4, więc jest to w zasadzie plik wsadowy. Zwykle, gdy uruchamiam plik wsadowy na 32-bitowym systemie operacyjnym, działa on w trybie 32-bitowym i kiedy uruchamiam go na 64-bitowym systemie operacyjnym, działa on w trybie 64-bitowym, prawda? Problem polega na tym, że mogę wybrać, czy program ma 32, czy 64-bitowy kod. Tak więc muszę wybrać 32 lub inaczej nie sądzę, że będzie działać na 32-bitowym systemie operacyjnym. Próbowałem użyć plików .vbs do ponownego uruchomienia programu przy użyciu .Run i .ShellExecute, ale wynikiem była architektura taka sama jak w konwerterze. Próbowałem również cmd /c i %WINDIR%\System32\cmd.exe /c, a także %WINDIR%\SysWOW64\cmd.exe /c, ale nie mogłem znaleźć sposób to zrobić. Używam systemu Windows 8.0 x64, a moją maszyną wirtualną jest Windows 8.1 x64.Jak uruchomić plik wsadowy w trybie 64-bitowym z pliku wsadowego w trybie 32-bitowym

Odpowiedz

2
c:\windows\sysnative 

Umożliwia dostęp do System32 dla programów 32-bitowych.

32 Bit

C:\Windows\System32 accesses syswow64 
c:\windows\sysnative accesses System32 

64 Bit po prostu robi to, co powiedział, dostęp do folderów bezpośrednio - np c: \ windows \ system32 dostęp System32 oraz C: \ Windows \ syswow64 dostęp syswow64.

Chodzi o to, że powinieneś pisać tylko program 32-bitowy. 64-bitowe programy są w większości 32-bitowe wewnętrznie (tylko adresy pamięci są 64-bitowe, wszystko pozostałe pozostaje 32-bitowe). 64 bity są przeznaczone dla aplikacji serwerowych. Użyj 32 bitów do ogólnych programów.

EDIT

32 programów bitowe są 32-bitowe z adresowania trybie 64 bitowym, z których 32 bity (adres bazowy jest zawsze 0 w systemie Windows) są nieużywane więc tylko 32 bitów (offset) jest wymagane do adresów pamięci .

64-bitowe programy są 32-bitowe z adresem pamięci 64-bitowej (nie znam rozmiaru adresu bazowego w trybie 64-bitowym, ponieważ są one zawsze zerowe i przez dziesięciolecia były nieistotne). 64-bitowy program może stać się pełnym 64-bitowym programem, po prostu za pomocą instrukcji 64-bitowych, gdy wybierze, ogólnie do zadań naukowych lub przetwarzania wideo. Ale 64-bitowe wszystko przeżywa za dużo pamięci, a biblioteki Windows i innych oczekują wartości 32-bitowych.

Ogólna zasada jest taka, że ​​nie musisz nic robić, aby osiągnąć swoje zadania. Ludzie wpadają w kłopoty, gdy zaczynają myśleć o 32bit/64bit. Jeśli zignorujesz bitness, Microsoft przygotował całą pracę, aby wszystko działało.

Jeśli wpiszesz iexpress w oknie Start - Uruchom (Winkey + R), będziesz mógł stworzyć własny plik bat2exe.

+0

Możesz być zainteresowany w tym http://social.msdn.microsoft.com/Forums/en-US/adcae113-4758-481a-a367-60d5d14d97d6/this- to-how-to-turn-vbs-and-js-files-into-exe-files-from-the-command-line-without-third-party-tools? forum = scripting –

+0

Próbowałem iexpress na moim 64-bitowym systemie operacyjnym i zadziałało, ale zastanawiam się, czy ten sam program mógłby działać w 32-bitowym systemie operacyjnym. Chcę, aby mój program działał w trybie 64-bitowym, ponieważ rzeczy, które rejestrują, nie są dostępne z reg.exe wywołanym z 32-bitowego pliku wsadowego. Nie mogę dodać wartości do "HKLM \ Software \ Microsoft \ Windows \ CurrentVersion \ Run", chyba że bezpośrednio uruchomię plik wsadowy lub skompiluję go w trybie 64-bitowym (lub z iExpress). – SkYWAGz

+0

Zobacz "reg flagi /?" –

4

Można użyć następujących w górnej części pliku wsadowego:

@echo off 
set "SystemPath=%SystemRoot%\System32" 
if not "%ProgramFiles(x86)%"=="" set "SystemPath=%SystemRoot%\Sysnative" 

Następnie trzeba zadzwonić każdą aplikację konsoli w katalogu System32 systemu Windows z %SystemPath% w pliku wsadowym, na przykład %SystemPath%\findstr.exe. Oczywiście można również uruchomić cmd z %SystemPath%\cmd.exe, aby zawsze uruchamiać interpreter wiersza poleceń 64-bitowych z pliku wsadowego.

Jak to działa?

Zmienna środowiskowa SystemPath jest ustawiana jako pierwsza w katalogu System32 systemu Windows.

Plik wsadowy spakowany w 32-bitowy plik wykonywalny uruchamia teraz wszystkie aplikacje konsolowe z katalogu System32 w 32-bitowym systemie Windows, ale z katalogu %SystemRoot%\SysWOW64 w 64-bitowym systemie Windows.

Dlatego plik wsadowy sprawdza dalej, jeśli istnieje zmienna środowiskowa , która ma miejsce tylko w systemie Windows x64. Dlatego warunek na trzeciej linii jest fałszywy na Windows x86 i SystemPath nie został zmieniony. Ale SystemPath został zmodyfikowany do %SystemRoot%\Sysnative w 64-bitowym systemie Windows w celu wywoływania aplikacji w %SystemRoot%\System32 z 32-bitowego pliku wykonywalnego odpowiednio cmd.exe bez przekierowania na %SystemRoot%\SysWOW64. Aby uzyskać więcej informacji, zobacz artykuł File System Redirector w witrynie Microsoft Developer Network (MSDN).

Ale lepiej byłoby zrobić wszystko wewnątrz pliku wykonywalnego 32-bitowym, który wydobywa plik wsadowy do %TEMP% i uruchomić go albo z

%SystemRoot%\System32\cmd.exe /C "%TEMP%\ExtractedBatch.bat" 

dla 32-bitowego systemu Windows, gdzie zmienna ProgramFiles (x86) nie istnieje lub jest z

%SystemRoot%\Sysnative\cmd.exe /C "%TEMP%\ExtractedBatch.bat" 

w 64-bitowym systemie Windows.

Oto jeszcze jeden kod, który może być użyty na górze pliku wsadowego do uruchamiania zawsze 64-bitowych aplikacji konsolowych, niezależnie od uruchamiania w systemie Windows x64 z 32-bitowym lub 64-bitowym cmd.exe.

@echo off 
set "SystemPath=%SystemRoot%\System32" 
if not "%ProgramFiles(x86)%"=="" (
    if exist %SystemRoot%\Sysnative\* set "SystemPath=%SystemRoot%\Sysnative" 
) 

Na Windows x64 jest dodatkowo sprawdzić, czy istnieją pliki w %SystemRoot%\Sysnative. W tym przypadku plik wsadowy jest wykonywany z 32-bitowym cmd.exe i tylko w tym przypadku musi być w ogóle użyty %SystemRoot%\Sysnative. W przeciwnym razie %SystemRoot%\System32 można używać również w systemie Windows x64, tak jak wtedy, gdy plik wsadowy jest uruchamiany z 64-bitowym cmd.exe, jest to katalog zawierający 64-bitowe aplikacje konsoli.

Uwaga: %SystemRoot%\Sysnative nie jest katalogiem. Nie jest możliwe, aby cd do %SystemRoot%\Sysnative lub użyj if exist %SystemRoot%\Sysnative

+0

To pomogło, ale nadal jestem zagubiony, kiedy uruchamiam plik wsadowy bezpośrednio to "% windir% \ Sysnative" nie istnieje – SkYWAGz

+0

Plik wsadowy działa zgodnie z oczekiwaniami, przetestowany na Windows 7 x64 i Windows XP x86. – Mofi

+0

Po wpisaniu cd% windir% \ Sysnative nie powiedzie się. – SkYWAGz