Что нового

Непонятная зависимость от разрядности скомпилированного скрипта

gora

Знающий
Сообщения
315
Репутация
19
Вот часть тестируемого скрипта (автор AZJIO):
Код:
$key = 'HKEY_CLASSES_ROOT\.jav'
If Not ProcessExists('regedit.exe') Then
	Run(@WindowsDir & '\SysWOW64\regedit.exe')	; х86
;	Run(@WindowsDir & '\regedit.exe')	; х64
	If Not WinWaitActive('[CLASS:RegEdit_RegEdit]', '', 3) Then Exit
EndIf
$hWnd = WinGetHandle('[CLASS:RegEdit_RegEdit]')
WinActivate($hWnd)
$hControl = ControlGetHandle($hWnd, '', '[CLASS:SysTreeView32; INSTANCE:1]')
$aKey = StringSplit($key, '\', 2)
$key = '#0'
For $i In $aKey
	$key &= '|' & $i
	ControlTreeView($hWnd, '', $hControl, 'Expand', $key)
Next
ControlTreeView($hWnd, '', $hControl, 'Select', $key)
;MsgBox(0, '', $hWnd & @CRLF & $hControl)
Exit

Если его скомпилировать в х86, то все работает и дерево в RegEdit раскрывается до нужного раздела. При компиляции в х64 RegEdit запускается, но дерево не раскрывается.
В чем проблема и как ее решить?

PS
Нужен запуск именно x86 RegEdit.
Спасибо
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
версия редактора реестра будет запускаться в зависимости от разрядности скрипта. то есть нет нужды указывать папку SysWOW64.
а в случае с компиляцией в х64 как раз это скорее всего и проводит к отрицательному результату
ну а чтобы использовать твой путь в скрипте х64
Код:
Run(@WindowsDir & '\SysWOW64\regedit.exe')

, то возможно нужно отключать перенаправление перед выполнением функции
Код:
DllCall("kernel32.dll", "int", "Wow64DisableWow64FsRedirection", "int", 1)
; здесь функция
DllCall("kernel32.dll", "int", "Wow64RevertWow64FsRedirection", "int", 1)

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

PS. я запускаю редактор с выделением ключа так

Код:
Func _JumpRegistry($Key)
	RegWrite('HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit', 'LastKey', 'REG_SZ', $Key)
	If Not @error Then Run(@WindowsDir & '\regedit.exe')
EndFunc   ;==>_JumpRegistry
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
joiner [?]
версия редактора реестра будет запускаться в зависимости от разрядности скрипта. то есть нет нужды указывать папку SysWOW64.
Вы невнимательны. Мне нужен не абы какой RegEdit, а...
gora [?]
Нужен запуск именно x86 RegEdit.

а в случае с компиляцией в х64 как раз это скорее всего и проводит к отрицательному результату
Поясните свою мысль. AutoIt (x64) не может работать с окнами х86 приложений? Почему? Какие из команд не должны работать с х86 приложениями? Где это написано?
я запускаю редактор с выделением ключа так
Ваш вариант требует перезапуска RegEdit и не сработает при запущенном RegEdit
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
ну так не вижу проблемы. х86 скрипт вызывает х64 редактор реестра. и не нужно указывать папку SysWOW64.



Добавлено:
Сообщение автоматически объединено:

у меня на win 7 x64 твой скрипт срабатывает нормально. и как х64 и как х86
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
OffTopic:
а я по чем знаю. видимо производитель в маркировке напутал :smile:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
joiner [?]
а я по чем знаю. видимо производитель в маркировке напутал
smiley.gif
не, я имел в виду это распространенная ошибка писать х32 или х64. процессоры все x86 (286,386,486 и тд). раньше когда 32 бита были стандартом, его просто не писали, подразумевая что x86 это и есть 32 разрядный процессор. сейчас, когда хотят подчеркнуть 64 битность, пишут либо amd64, либо x86_64, при этом если же наоборот, хотят явно указать 32 битность, пишут х86_32, хотя довольно редко
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
joiner [?]
у меня на win 7 x64 твой скрипт срабатывает нормально. и как х64 и как х86
Сомневаюсь я достоверности Вашей информации, ибо этого быть не должно:
joiner [?]
ну так не вижу проблемы. х86 скрипт вызывает х64 редактор реестра


Что по-Вашему "нормально" ? И каковы были условия тестирования? Перед каждым запуском скрипта в RegEdit сворачивалось дерево и производился переход в корень реестра, или как один раз открылась нужная ветка так из нее и не выходили (пусть даже и с закрытием RegEdit) при каждом запуске скрипта?

Кто-то еще может протестировать скрипт на win7 x64, дабы подтвердить или опровергнуть информацию из первого поста?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
gora [?]
Сомневаюсь я достоверности Вашей информации, ибо этого быть не должно:
не должно быть идиотов на свете.
твой скрипт
Код:
$key = 'HKEY_CLASSES_ROOT\.jav'
If Not ProcessExists('regedit.exe') Then
  Run(@WindowsDir & '\regedit.exe')
    If Not WinWaitActive('[CLASS:RegEdit_RegEdit]', '', 3) Then Exit
EndIf
$hWnd = WinGetHandle('[CLASS:RegEdit_RegEdit]')
WinActivate($hWnd)
$hControl = ControlGetHandle($hWnd, '', '[CLASS:SysTreeView32; INSTANCE:1]')
$aKey = StringSplit($key, '\', 2)
$key = '#0'
For $i In $aKey
    $key &= '|' & $i
    ControlTreeView($hWnd, '', $hControl, 'Expand', $key)
Next
ControlTreeView($hWnd, '', $hControl, 'Select', $key)
Exit

видно что путь к редактору реестра стандартный. я компилирую этот код как х86 . и запускаю. открывается редактор и выделяется нужный ключ. потом я делаю компиляцию скрипта как х64. в редакторе реестра делаю произвольные переходы, чтобы сбить редактору память о предыдущем переходе и запускаю скрипт. открывается заданный ключ.
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
joiner [?]
видно что путь к редактору реестра стандартный.
Видно! Видно, что Вы изменили скрипт!!!
gora [?]
$key = 'HKEY_CLASSES_ROOT\.jav'
If Not ProcessExists('regedit.exe') Then
Run(@WindowsDir & '\SysWOW64\regedit.exe') ; х86
Такие результаты мне не интересны, мне нужен тест моего скрипта, а не измененного Вами.


Добавлено:
Сообщение автоматически объединено:

joiner [?]
не должно быть идиотов на свете.
Это Вас не красит
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
присказку к себе не относи..это к слову.
я ничего не менял в скрипте. только использовал стандартный путь. у тебя он тоже есть . как комент
при запуске скрипта х86 запускает regedit*32. можешь проверить в диспетчере задач. ну а другой разрядности скрипт запускает другой разрядности редактор.
и при использовании твоего варианта пути, запускается то regedit*32, но не срабатывает все остальное. а запускается этот редактор, только потому что указан полный путь.
Код:
Run(@WindowsDir & '\SysWOW64\regedit.exe')

при компиляции скрипта как х64, получаешь только запуск редактора без выделения нужного ключа. я не могу понять смысл указания этого пути. разве нельзя по другому решить задачу?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
OffTopic:
joiner [?]
не должно быть идиотов на свете
По твоему умный человек должен озвучивать такие слова?

P.S.
И кстати они нужны, иначе бы не было и умных :laugh:.
 
Верх