PDA

Показать полную графическую версию : [решено] reg.exe - как нежелательное имя для скрипта?


semiono
17-05-2010, 02:13
Не могу понять в чём я ошибся, но скрипт запускается многократно вплоть до зависания.

Сам код ничего особенного не представляет:
ProgressOn("MyProg...", "")
ProgressSet(100)

ShellExecute("MyProg.exe", "", @ProgramFilesDir & "\MyProg")
Sleep(3000)

$PID = ProcessExists("MyProg.exe")
ProcessClose($PID)


RegWrite("HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\MyProg.exe", "", "REG_SZ", @ProgramFilesDir & "\MyProg\MyProg.exe")
RegWrite("HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\MyProg.exe", "Path", "REG_SZ", @ProgramFilesDir & "\MyProg")

FileCreateShortcut(@ProgramFilesDir & "\MyProg\MyProg.exe", @UserProfileDir & "\SendTo\MyProg.lnk", @ProgramFilesDir & "\MyProg", "", "MyProg", @ProgramFilesDir & "\MyProg\Sam.ico", "", 0, @SW_SHOWNORMAL)
FileCreateShortcut(@ProgramFilesDir & "\MyProg\MyProg.exe", @ProgramsDir & "\MyProg.lnk", @ProgramFilesDir & "\MyProg", "", "MyProg", @ProgramFilesDir & "\MyProg\Sam.ico", "", 0, @SW_SHOWNORMAL)

$file = FileOpen(@SystemDir & "\Sam.cmd", 10)
FileWrite($file, '@start "" "' & @ProgramFilesDir & '\MyProg\MyProg.exe"' & ' %*' & @CRLF)
FileClose($file)

FileDelete(@ProgramFilesDir & "\MyProg\MyProg.exe")
Sleep(1000)

FileMove(@ProgramFilesDir & "\MyProg\Sam.bin", @ProgramFilesDir & "\MyProg\MyProg.exe", 9)
Sleep(1000)

ProgressOff()

ShellExecute("MyProg.exe", "", @ProgramFilesDir & "\MyProg")

Exit

Всё что мне приходит на ум, это название моего скрипта reg.exe, хотя лгика мне всёравное не ясна.

Ещё одна фитча, то что у меня reg.exe прописан на удаление в реестре в PendingFileRenameOperations,
хотя это тоже как бы не причём.

Причём это сразу не проявилось, толи после кампиляции au3 в exe, вообщем какая-то странность!

semiono
17-05-2010, 05:12
Ничего не понимаю! Имя файла тут тоже не причём. Запускается скрипт рекурсивно, будто бы я такое написал

bat.cmd:
bat.cmd

Кстати, теперь я приписал к скрипту такое FileDelete(@ScriptName), само по себе это работает, проверял
на отдельном скрипте.

Creat0R
17-05-2010, 08:31
Сам код ничего особенного не представляет »
«ShellExecute» на самом деле что запускает?
У меня этот скрипт естественно выдаёт ошибку запуска MyProg.exe.

semiono
17-05-2010, 18:00
Сначала запускается приложение MyProg.exe, потом оно закрывается через ProcessClose()
и файл MyProg.exe удаляется, после чего на его место копируется обновлённая версия MyProg.exe.
Это нужно было для того чтобы в реестр записать установки, так как новая версия MyProg.exe
этого зделать не может, так как она из апдейта идёт. Вообщем подмена такая хитрая.
Ну буду думать дальше что за трабла там... Может с кампиляцией что-то не так?

У меня всегда варианты запуска установленны повсюду:
1. HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\MyProg.exe
2. @SystemDir & "\MyProg.cmd"
Однако, ShellExecute() явно указывает на рабочую папку, причём циклический запуск нигде не предполагается.

Вот сейчас ещё подумалось, может само приложение MyProg.exe так устроенно зачем-то изнутри...
Тогда автоит не причём если так. Ладно, ОК!

Creat0R
17-05-2010, 18:44
Сначала запускается приложение...»
Что делает скрипт, я вижду сам :) я спрашиваю что это за приложение MyProg.exe, какое его назначение?

P.S
reg это системная утилита, возможно этот самый MyProg.exe пытается запустить эту команду (консольную утилиту reg.exe), и в первую очередь ищет не в системе, а как раз в рабочем каталоге.

semiono
17-05-2010, 21:59
Я нашёл причину! Всётаки это здесь было...

[HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\MyProg.exe]
@="C:\I\Apps\MyProg\MyProg.exe"

Для корректности первого запуска я все ссылки установил на запуск скрипта, а не самой программы.
После исполнения скрипт сам поправит ссылки на приложение как положено.
Тоесть после инсталяции у меня было так

[HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\MyProg.exe]
@="C:\I\Apps\MyProg\Script.exe"

Ну а далее что видно из скрипта замена:
RegWrite("HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\MyProg.exe", "", "REG_SZ", @ProgramFilesDir & "\MyProg\MyProg.exe")

Вот как раз из-за того что скрипт прописан в ...CurrentVersion\App Paths\ он и запускается рекурсивно
из под ShellExecute() Хотя по большому счёту это баг то ли в автоит, то ли в Ms API.
Ну не совсем баг, а как бы недочёт. =)

---
Я как-то нагуглил ваш автиоит форум, там обсуждение было FileDelete(@ScriptName),
у меня это чётко работает, может это в новых версиях автоит улучшили?
Или всётаки лучше через cmd /k delete ....ping ... делать? :)

У меня на асме есть ещё решение через PendingFileRenameOperations реестра...
Правда с перезагрузкой.
include '%fasm%\win32ax.inc'

section '.code' code readable executable

start:
invoke ExpandEnvironmentStrings,lpDrv,lpStr1,400h
invoke lstrcat,lpStr1,File1
invoke MoveFileEx,lpStr1,NULL,MOVEFILE_DELAY_UNTIL_REBOOT
exit:
invoke ExitProcess,0

section '.data' data readable writeable

lpDrv db '%ProgramFiles%',0

File1 db '\Samplitude\Rn5b.exe',0

lpStr1 db ?

section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL'
include '%fasm%\api\kernel32.inc'

Но теперь наверное воспользуюсь FileDelete(@ScriptName)

Creat0R
17-05-2010, 22:22
по большому счёту это баг то ли в автоит, то ли в Ms API.
Ну не совсем баг, а как бы недочёт »
Поскольку ответа от тебя я так и не дождался, то осмелюсь сказать что баг у тебя в скрипте или в вызываемой им программе, судя по описанию это неправильный подход для такой задачи (если я её конечно хоть как то понял).

P.S
Тема решена?

semiono
17-05-2010, 22:30
Creat0R, а что даст название программы, я вовсе не скрывал этого!?
Просто какая разница калькулятор, блокнот или Samplitude.exe это будет?
Конечно я не прав что сразу достаточно информации не предоставил, но я и сам гадаю что там было.

Однако сейчас понял, нельзя было скрипт сюда прописывать:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Sam.exe
Вот сейчас ещё один момент проверил, оказывается Run() работает правильно невзирая на реестр.
Ну собственно ShellExecute() привязан к оболочке по своей сути, а часть реестра App Paths, это тоже
привязка к оболочке насколько я понимаю.

---
FileDelete(@ScriptName) не работает, я зря радовался, беру слова обратно.

---
Тема решена! :)
http://forum.oszone.net/images/buttons/resolved.gif

Creat0R
17-05-2010, 23:08
FileDelete(@ScriptName) не работает »
Работает только для нескомпилированных скриптов, но это уже не по теме, т.ч на эту тему оффтоп заканчиваем.




© OSzone.net 2001-2012