Что нового

Как запустить 64-битное приложение из скрипта, скомпилированного в 32-бит

seriych

Новичок
Сообщения
18
Репутация
0
В общем нужно, чтобы скрипт работал как в 32-битной винде, так и в 64-битной. Соответственно компилировать нужно в 32 бита. Но из скрипта нужно запускать внешнюю программу, которая 64-битная в 64-битной винде (мне нужен msconfig, если это принципиально).
Но если мы откомпилируем строку
Код:
ShellExecute (@WindowsDir & "\System32\msconfig.exe")

в 32-битное приложение, то в 64-битной винде выдается ошибка "приложение не найдено".
Как сделать, чтобы независимо от битности винды и внешнего приложения, внешнее приложение запускалось?

Найденное решение (спасибо Yashied):
Код:
$tValue = DllStructCreate('dword')
If @OSArch = 'X64' Then
    DllCall('kernel32.dll', 'int', 'Wow64DisableWow64FsRedirection', 'ptr', DllStructGetPtr($tValue))
EndIf
ShellExecute(@WindowsDir & "\System32\msconfig.exe")
If @OSArch = 'X64' Then
    DllCall('kernel32.dll', 'int', 'Wow64RevertWow64FsRedirection', 'ptr', DllStructGetPtr($tValue))
EndIf
 

sforce5

Олл фо ЛулзЪ
Сообщения
160
Репутация
41
А не лехче это делать так:

Код:
ShellExecute (@SystemDir & "\msconfig.exe")


Патамучта в x64 не System32, а SysWOW64 (вроде)
 
Автор
S

seriych

Новичок
Сообщения
18
Репутация
0
Путь в семерке именно такой независимо от битности винды (в XP х32 другой, в х64 не знаю). Разные варианты типа "msconfig" или "msconfig.exe" тоже пробовал. Если скомпилировать в 64-бита, то все работает прекрасно, но естественно, на 32-битной винде вообще не запускается.
Думаю, что проблема именно в битности. Подробнее написано тут:
http://forum.oszone.net/post-1463869.html#post1463869
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Всего лишь интуиция, но что если сделать так:

Код:
Run(@ComSpec & ' /C Start "" "msconfig"', '', @SW_HIDE)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Я думаю, что в этом виноват WOW64, он перенаправляет все запросы к папке System32 на папку SysWOW64. Если это так, то использовать ShellExecute() не получится. Попробуй через cmd.exe.

Код:
ShellExecute(@ComSpec, '/c C:\Windows\System32\msconfig.exe', '', '', @SW_HIDE)


или так

Код:
$tValue = DllStructCreate('dword')
If @OSArch = 'X64' Then
	DllCall('kernel32.dll', 'int', 'Wow64DisableWow64FsRedirection', 'ptr', DllStructGetPtr($tValue))
EndIf
ShellExecute(@SystemDir & '\msconfig.exe')
If @OSArch = 'X64' Then
	DllCall('kernel32.dll', 'int', 'Wow64RevertWow64FsRedirection', 'ptr', DllStructGetPtr($tValue))
EndIf


Я не могу проверить, т.к. нет 64-битной системы.

OffTopic:
А зачем вообще нужно ставить 64-битные системы простым смертным? Быстрее будут работать только те программы, что написаны для этих систем (которых на данный момент не так уж и много, а правильно написанные, вообще по пальцам пересчитать можно), а 32-битные приложения работают через "эмулятор" и как правило медленнее. Я несколько раз ставил Windows x64 и всегда проблем имел намного больше, чем пользы. Про игры я вообще молчу...

Если вы проффесионально используете Photoshop для обработки широкоформатных изображений, тогда это можно понять. В этом случае имеет смысл поставить Windows 7 x64 и напихать в компьютер памяти по самое немогу. Но как правило, эти люди не пользуются ShellExecute().

:smile:
 
Автор
S

seriych

Новичок
Сообщения
18
Репутация
0
CreatoR сказал(а):
Код:
Run(@ComSpec & ' /C Start "" "msconfig"', '', @SW_HIDE)
Так тоже пробовал. Не хочет.

Yashied сказал(а):
Попробуй через cmd.exe.
Код:
ShellExecute(@ComSpec, '/c C:\Windows\System32\msconfig.exe', '', '', @SW_HIDE)
по сути тоже самое, тоже не работает.

Yashied сказал(а):
Я думаю, что в этом виноват WOW64, он перенаправляет все запросы к папке System32 на папку SysWOW64.
Код:
$tValue = DllStructCreate('dword')
If @OSArch = 'X64' Then
	DllCall('kernel32.dll', 'int', 'Wow64DisableWow64FsRedirection', 'ptr', DllStructGetPtr($tValue))
EndIf
ShellExecute(@SystemDir & '\msconfig.exe')
If @OSArch = 'X64' Then
	DllCall('kernel32.dll', 'int', 'Wow64RevertWow64FsRedirection', 'ptr', DllStructGetPtr($tValue))
EndIf
А вот это работает! Где кнопка +10? :smile: А то я бы себе еще долго мозг взрывал. Только все же
Код:
ShellExecute(@WindowsDir & "\System32\msconfig.exe")

Я так понимаю тут сначала отключение перенаправления, а потом включение его обратно?

OffTopic:
что ж поделать, если на всех новых компах, где от 4ГБ оперативки, стоит 64-я винда.
 

SyDr

Сидра
Сообщения
651
Репутация
158
:
Ну ведь есть же это в справке, есть!
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
seriych сказал(а):
Я так понимаю тут сначала отключение перенаправления, а потом включение его обратно?

Да.

А почему ты просто не откомпилируешь скрипт для x64? В этом случае и проблем бы не было.
 
Автор
S

seriych

Новичок
Сообщения
18
Репутация
0
Тогда скрипт не будет запускаться на х32. А его будут использовать люди, которые понятия не имеют, как определить битность ОС.

А в справке действительно это есть, оказывается. Не думал, что в самом начале будет :smile: Правда там в несколько ином виде написано. Ладно, всем спасибо.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
seriych [?]
Тогда скрипт не будет запускаться на х32
Можно ещё поместить в скомпилированный скрипт под x32 дополнительный скрипт для x64, и распаковывать его при определений 64-битной системы.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Алексей
как твой вопрос относится к данной теме? создай отдельно, но на всякий случай, вот чтиво перед созданием

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Как правильно называть темы

С уважением, Модератор раздела.






ну и судя по твоему сообщению

Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, Модератор раздела.
 
Верх