Кто знает, как можно реализовать такую вещь: вообщем в программе когда пользователь изменяет настройки, ему выдается сообщение о том, что необходимо перезапустить программу. Если юзер ответил да, то - программа закрывается, и нужно её заново запускать. А можно сделать так, что программа например создавала bat файл перед этой операцией и как только пользователь завершал работу, запускался bat файл который запускал бы программу мою, после чего автоматически удалялся? заранее спасибо.
» Автоматический перезапуск программы при изменении настроек
А в чём проблема? Создать текстовый документ или в батанике (искустве создавать bat файлы)?
вот такой должен подойти.
app.exe
del app.bat
где app.exe - имя твоей программы
app.bat - твой батник
вот такой должен подойти.
app.exe
del app.bat
где app.exe - имя твоей программы
app.bat - твой батник
OdesitVadim
проблема в том, как сделать так, что бы этот файл запустился только после закрытия программы?
проблема в том, как сделать так, что бы этот файл запустился только после закрытия программы?
vovanzp
А кто мешает тебе его самостоятельно запустить в FormClose?
А кто мешает тебе его самостоятельно запустить в FormClose?
vovanzp
Можно еще добавить задержку времени в bat для гарантированного закрытия программы.
Собственно можно сделать еще веселее. Добавить еще один ехешник, который будет перезапускать программу. Тогда его можно вызывать не только на FormClose(OdesitVadim), а в любой момент. И пусть он проверяет есть app.exe в памяти или уже пора запускать.
Можно еще добавить задержку времени в bat для гарантированного закрытия программы.
Собственно можно сделать еще веселее. Добавить еще один ехешник, который будет перезапускать программу. Тогда его можно вызывать не только на FormClose(OdesitVadim), а в любой момент. И пусть он проверяет есть app.exe в памяти или уже пора запускать.
dneprcomp
Цитата:
Я так всегда делаю. А вот в человека появляться вопросы "как убрать консольное окно", "как сделать ещё что то".
Цитата:
Добавить еще один ехешник, который будет перезапускать программу.
Я так всегда делаю. А вот в человека появляться вопросы "как убрать консольное окно", "как сделать ещё что то".
dneprcomp
действительно, как закрыть консольное оконо bat файла?
действительно, как закрыть консольное оконо bat файла?
В этом случае (тоесть когда мы запускали как батник для перезапуска)?
Это надо в свойствах батника проставить автоматически закрываться. Но конкретно для этого ты так просто не поставишь, поэтому нужно открыть свойства любого батника и настроить это там и при запросе применить только к этому файлу или всем остальным, нужно казать - "ко всем". Правда если ты собираешся распространять своё приложение, то это может быть недопустимым.
Это надо в свойствах батника проставить автоматически закрываться. Но конкретно для этого ты так просто не поставишь, поэтому нужно открыть свойства любого батника и настроить это там и при запросе применить только к этому файлу или всем остальным, нужно казать - "ко всем". Правда если ты собираешся распространять своё приложение, то это может быть недопустимым.
не понял я прикола.
а просто запустить второй экземпляр программы после чего благополучно умереть -- не интересно?
а просто запустить второй экземпляр программы после чего благополучно умереть -- не интересно?
dyr farot
Ну в некоторых случаях надо сделать дополнительные действия - тут дополнительная прога к стати. У меня к примеру работает следующая связка. Прога активно передаёт по сети. Как следствие - время от времени подвисает (работает она 24 часа в сутки, а подвиснуть может раз в месяц). Вторая прога следит за этой и если заметила что -то не то, то запускает прогу-камикадзе. Та убивает извращённым способом (она подключается к ней как отладчик, а потом себя убивает - видновс автоматом прибёт и отлажываемый процесс - работает отлично). В это время вторая следит за этим и если камикадзе не справляется с поставленой задачей, то перегружает комп. После этого запускается "стартер", который закрывает высячие соединения, делает "зачистку" остатков, а также посылает по сети другой проге, которая принимала данные, что у нас тут были проблемы. И запускает снова прогу. Выглядит страшно, но работает на ура. Со стороны выглядит красиво, особенно если проги на соседних компах.
Ну в некоторых случаях надо сделать дополнительные действия - тут дополнительная прога к стати. У меня к примеру работает следующая связка. Прога активно передаёт по сети. Как следствие - время от времени подвисает (работает она 24 часа в сутки, а подвиснуть может раз в месяц). Вторая прога следит за этой и если заметила что -то не то, то запускает прогу-камикадзе. Та убивает извращённым способом (она подключается к ней как отладчик, а потом себя убивает - видновс автоматом прибёт и отлажываемый процесс - работает отлично). В это время вторая следит за этим и если камикадзе не справляется с поставленой задачей, то перегружает комп. После этого запускается "стартер", который закрывает высячие соединения, делает "зачистку" остатков, а также посылает по сети другой проге, которая принимала данные, что у нас тут были проблемы. И запускает снова прогу. Выглядит страшно, но работает на ура. Со стороны выглядит красиво, особенно если проги на соседних компах.
dyr farot
в программе имеется защита от запуска второго экземпляра пограммы
в программе имеется защита от запуска второго экземпляра пограммы
при выходе создавай мьютекс а в защите смотри создан он или нет; если создан -- допускать создание второго экземпляра...
vovanzp
Цитата:
Так кто мешает использовать его в нужных целях?
Обычно код проверки на запущеность выглядит так
Код:
if @AppRun@ then exit;//или активация предыдущей копии
Цитата:
в программе имеется защита от запуска второго экземпляра пограммы
Так кто мешает использовать его в нужных целях?
Обычно код проверки на запущеность выглядит так
Код:
if @AppRun@ then exit;//или активация предыдущей копии
Мои 5 копеек. При запуске приложению можно указывать PID порождающего процесса (даже сам процесс может выяснить PID родителя, если не ошибаюсь). Приложение может подождать, пока процесс-родитель не умрет, а затем благополучно активироваться.
Mickey_from_nsk
Только надо вставить проверку на то, что родителем не является Exporer, а то получиться забавный глюк.
Только надо вставить проверку на то, что родителем не является Exporer, а то получиться забавный глюк.
vovanzp
А ты не пробовал просто написать exit ?
Добавлено:
OdesitVadim
Если держать проверяющий процесс все время в памяти, то тогда лучше использовать WaitForSingleObject вместо Sleep. Что-нибудь в таком роде:
Код: Public Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) As Long
Public Sub WaitForTerm(varTemp As Variant)
Dim phnd&
phnd = OpenProcess(SYNCHRONIZE, 0, varTempor)
If phnd <> 0 Then
Call WaitForSingleObject(phnd, INFINITE)
Call CloseHandle(phnd)
End If
'запуск контролируемой программы из висящей в памяти
varTemp = Shell((запускаемая программа), vbMaximizedFocus)
'ждем, пока программа не уйдет из памяти
WaitForTerm varTemp
'запускаем по новой и повторяем цикл
End Sub
А ты не пробовал просто написать exit ?
Добавлено:
OdesitVadim
Если держать проверяющий процесс все время в памяти, то тогда лучше использовать WaitForSingleObject вместо Sleep. Что-нибудь в таком роде:
Код: Public Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) As Long
Public Sub WaitForTerm(varTemp As Variant)
Dim phnd&
phnd = OpenProcess(SYNCHRONIZE, 0, varTempor)
If phnd <> 0 Then
Call WaitForSingleObject(phnd, INFINITE)
Call CloseHandle(phnd)
End If
'запуск контролируемой программы из висящей в памяти
varTemp = Shell((запускаемая программа), vbMaximizedFocus)
'ждем, пока программа не уйдет из памяти
WaitForTerm varTemp
'запускаем по новой и повторяем цикл
End Sub
dneprcomp
Цитата:
Процесс будет ждать пока не умрет родитель, то есть експлорер, короче при завершении работы винды он запустится как раз тогда проводник умрет.
А вообще можно сделать проще ИМХО, тут уже говорили насчет PIDов, то есть программа при старте анализирует командную строку, если в качестве параметра есть число, то делаем TerminateProcess с этим числом (правда блин если не админ, то может прав не хватить).
dyr farot
Цитата:
когда надо рестартнуть создаем Атом Прога1, запускаем второй эксземпляр, он смотрит, что есть мьютекс и создает Атом Прога2, (в этот момент первая прога смотрит его наличие в системе, если есть, то закрываем первый Атом и выход). А второй экземпляр смотрит наличие первого атома, как только он исчез, закрываем второй и создаем первый. Либо можно проще, при старте софтины посылается бродкаст (я надеюсь софтина оконная) со своим типом сообщения, как только приложение его ловит оно завершает свою работу, хотя тут нужно сделать всетаки дополнительное создание мьютекса, чтобы простой повторный запуск не грохнул основной процесс. Короче первый мой вариант мне больше нравится.
Цитата:
То, что забавный, я чуствую Но лень проверять. Как будет выглядеть?
Процесс будет ждать пока не умрет родитель, то есть експлорер, короче при завершении работы винды он запустится как раз тогда проводник умрет.
А вообще можно сделать проще ИМХО, тут уже говорили насчет PIDов, то есть программа при старте анализирует командную строку, если в качестве параметра есть число, то делаем TerminateProcess с этим числом (правда блин если не админ, то может прав не хватить).
dyr farot
Цитата:
при выходе создавай мьютекс а в защите смотри создан он или нет; если создан -- допускать создание второго экземпляра...
когда надо рестартнуть создаем Атом Прога1, запускаем второй эксземпляр, он смотрит, что есть мьютекс и создает Атом Прога2, (в этот момент первая прога смотрит его наличие в системе, если есть, то закрываем первый Атом и выход). А второй экземпляр смотрит наличие первого атома, как только он исчез, закрываем второй и создаем первый. Либо можно проще, при старте софтины посылается бродкаст (я надеюсь софтина оконная) со своим типом сообщения, как только приложение его ловит оно завершает свою работу, хотя тут нужно сделать всетаки дополнительное создание мьютекса, чтобы простой повторный запуск не грохнул основной процесс. Короче первый мой вариант мне больше нравится.
ShIvADeSt
Цитата:
Цитата:
Процесс будет ждать пока не умрет родитель, то есть експлорер, короче при завершении работы винды он запуститсяТогда это не так интересно. Я думал, что он не даст винде выключится. Или закольцует что-нибудь.
OdesitVadim
Вернее, надо проверить, что родителем является само приложение Мало ли кто захочет его запустить.
Вернее, надо проверить, что родителем является само приложение Мало ли кто захочет его запустить.
dneprcomp
Цитата:
Если точнее, то будет следующее. Винды пойдут на завершение. Возможно даже увидишь "завершение работы" (всё зависит от росторопности винды в конкретном случае). А дальше два сценария
1) Приложение запускается и сразу прибивается как зависшее.
2) Приложение не будет запущено и будет выведено сообщение "Не удалось инициализировать из за останова станции" (ну или почти такое, непомню)
Цитата:
То, что забавный, я чуствую Но лень проверять. Как будет выглядеть?
Если точнее, то будет следующее. Винды пойдут на завершение. Возможно даже увидишь "завершение работы" (всё зависит от росторопности винды в конкретном случае). А дальше два сценария
1) Приложение запускается и сразу прибивается как зависшее.
2) Приложение не будет запущено и будет выведено сообщение "Не удалось инициализировать из за останова станции" (ну или почти такое, непомню)
dneprcomp
пробывал набрать exit Но окно не закрылось всеравно
пробывал набрать exit Но окно не закрылось всеравно
vovanzp
А оно и не закроется. Потому что не обязано. Внимательно читай, то что я писал про батники.
Если для твоего батника не применены особые настройки (если динамически создаёш то настройки по умолчанию), то поведение батника будет описываться pif файлом. он кажеться называется _default.pif и находиться в папке windows. Щёлкаеш по нём правой кнопкой миши и смотриш свойства на вкладке "Программа". Там есть галочка "Закрыть окно по завершению". Если она будет снята, но не будет окно закрываться.
А оно и не закроется. Потому что не обязано. Внимательно читай, то что я писал про батники.
Если для твоего батника не применены особые настройки (если динамически создаёш то настройки по умолчанию), то поведение батника будет описываться pif файлом. он кажеться называется _default.pif и находиться в папке windows. Щёлкаеш по нём правой кнопкой миши и смотриш свойства на вкладке "Программа". Там есть галочка "Закрыть окно по завершению". Если она будет снята, но не будет окно закрываться.
для более "правильного" убиения процесса можно пользовать утилиту pskill из комплекта SysInternals, вот линк: http://www.sysinternals.com/ProcessesAndThreadsUtilities.html
убивает - намертво, сам этим активно пользуюсь.
вот её параметры:
Usage: pskill [-t] [\\computer [-u username [-p password]]] <process ID | name>
-t Kill the process and its descendants.
-u Specifies optional user name for login to
remote computer.
-p Specifies optional password for user name. If you omit this
you will be prompted to enter a hidden password.
убивает - намертво, сам этим активно пользуюсь.
вот её параметры:
Usage: pskill [-t] [\\computer [-u username [-p password]]] <process ID | name>
-t Kill the process and its descendants.
-u Specifies optional user name for login to
remote computer.
-p Specifies optional password for user name. If you omit this
you will be prompted to enter a hidden password.
PaNov
В данном случае эта программа мало поможет. Как себе представляеш процес прибивания батника. Кто запустит pskill?
В данном случае эта программа мало поможет. Как себе представляеш процес прибивания батника. Кто запустит pskill?
Фигасе навелосипедили
Короче есть готовое решение в софтине nnCron, тулза называется nnguard (используется
для так называемого "непотопляемого режима"). В оригинале запускается следующим образом:
Код: nnguard.exe <PID nncron> net start nncron
Короче есть готовое решение в софтине nnCron, тулза называется nnguard (используется
для так называемого "непотопляемого режима"). В оригинале запускается следующим образом:
Код: nnguard.exe <PID nncron> net start nncron
gerrCrazzy
что-то нашел на яндексе но там все с Unix связано
попробую еще поискать, есть вопрос не потеме: как можно запретить MDIForm использовать полосы прокрутки?
что-то нашел на яндексе но там все с Unix связано
попробую еще поискать, есть вопрос не потеме: как можно запретить MDIForm использовать полосы прокрутки?
vovanzp, собственно я имел ввиду этот nncron, да и к самой проге как таковой моё решение имеет самое косвенное отношение(имел ввиду тулзень входящую в дистрибутив).
Страницы: 1
Предыдущая тема: Как распечатать из Delphi
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.