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
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.
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
To pomogło, ale nadal jestem zagubiony, kiedy uruchamiam plik wsadowy bezpośrednio to "% windir% \ Sysnative" nie istnieje – SkYWAGz
Plik wsadowy działa zgodnie z oczekiwaniami, przetestowany na Windows 7 x64 i Windows XP x86. – Mofi
Po wpisaniu cd% windir% \ Sysnative nie powiedzie się. – SkYWAGz
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 –
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
Zobacz "reg flagi /?" –