Компиляция для .BAT ?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
серверянин
Новичок
Новичок
 
Сообщения: 32
Зарегистрирован: 19.09.2023 (Вт) 8:00
Откуда: РФ

Компиляция для .BAT ?

Сообщение серверянин » 25.01.2024 (Чт) 9:45

Пусть у нас есть проект VB6, скомпилированный в стандартный .exe: proect1.exe, и мы ставим его запуск в bat-файл.
Нюанс состоит в том, что выполнение .bat остановится до тех пор, пока proect1.exe не выполнится до конца и закроется.

Вопрос:
Как сделать так, чтобы выполнение .bat продолжилось, не ожидая закрытия proect1.exe ?
Тривиальное решение таково: нужно использовать для запуска proect1.exe команду start.

А можно ли написать или скомпилировать proect1 таким образом, чтоб оставаясь в работе, он сам освобождал дальнейшее выполненение .bat, не требуя для своего запуска специальной команды start? Как это сделать?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Компиляция для .BAT ?

Сообщение Mikle » 25.01.2024 (Чт) 17:31

Можно как-то так:
Вложения
Test.zip
(4.34 Кб) Скачиваний: 30

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Компиляция для .BAT ?

Сообщение Хакер » 25.01.2024 (Чт) 21:48

серверянин писал(а):не требуя для своего запуска специальной команды start?

В чём проблема с командой START?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

серверянин
Новичок
Новичок
 
Сообщения: 32
Зарегистрирован: 19.09.2023 (Вт) 8:00
Откуда: РФ

Re: Компиляция для .BAT ?

Сообщение серверянин » 26.01.2024 (Пт) 13:57

Это не проблема.
Просто хочется знать: как написать такую прогу, которая позволяла бы просто ставить себя в .BAT .
Для пользователя удобнее.

(Если это в принципе возможно - то почему бы мне не сделать, если знать?)

Mikle:
Да, перезапуск с параметром против зацикливания - это самое первое, что приходило и мне в голову.
Появляется некоторая сложность, если прога сама принимает другие параметры. Приходится парсить строку и это таки определенный гимор.
Поэтому я хотел выяснить - не существует ли каких-нибудь других путей, может с API что-нибудь. Ведь сама утилита START это как-то же делала.
Последний раз редактировалось серверянин 26.01.2024 (Пт) 16:39, всего редактировалось 2 раз(а).

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Компиляция для .BAT ?

Сообщение Mikle » 26.01.2024 (Пт) 16:26

серверянин писал(а):Ведь сама утилита START это как-то же делала.

Очевидно, она это не могла не делать - ведь в .BAT файле происходит запуск и ожидание окончания работы утилиты Start.
серверянин писал(а):Приходится парсить строку и это таки определенный гимор.

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

серверянин
Новичок
Новичок
 
Сообщения: 32
Зарегистрирован: 19.09.2023 (Вт) 8:00
Откуда: РФ

Re: Компиляция для .BAT ?

Сообщение серверянин » 26.01.2024 (Пт) 16:44

Я пробовал сделать так:
вместо опознавательного параметра, первый экземпляр проверяет наличие второго, и если его нет, то запускает, а запущенный второй пытается найти и закрыть первый.
Но так как та программа еще должна была вообще работать только одним экземпляром, то в результате получилась страшная дребедень и я бросил тот вариант.

Точнее, вопрос находится в такой плоскости: неизбежен ли перезапуск вторым экземпляром (с параметром или иными способами), или можно освободить текущий процесс, не закрывая его?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Компиляция для .BAT ?

Сообщение Хакер » 26.01.2024 (Пт) 17:51

серверянин писал(а):Это не проблема.

Если не проблема, то просто используй START.

серверянин писал(а):Просто хочется знать: как написать такую прогу, которая позволяла бы просто ставить себя в .BAT .

Любая программа и так позволяет просто вставить свой вызов в .BAT.

серверянин писал(а):Для пользователя удобнее.

Как раз таки для большинства пользователей удобно, чтобы программы из батника работали в порядке очередь — одна отработала, запускается другая, затем следующая. Если вторая команда будет запущена до того, как отработает предыдущая, в большинстве случаев бывает черт знает что, потому что обычно последующая программа использует результат работы предыдущей.

Поэтому то, что программы запускаются по порядку — это не фишка запускаемой программы и не недостаток запускаемой программы, это фишка интерпрератора BAT-файлов. Это на уровне интерпретатора заложена такая логика работы. Нет чего-то такого, что можно было бы сделать внутри программы, чтобы на это повлиять Нет чего-то такого, что можно было бы наоборот не делать внутри программы, чтобы на это повлиять.

И это то, что нужно и удобно 99% людей. Так, во-первых, если программы выводят что-то в консоль/stdout, то они могут свои сообщения об успехе, прогрессе или ошибках выводить по очереди: а в твоём случае они все будет одновременно выводить текст и он превратится в мешанину. Во-вторых, если какая-то программа отработала с ошибкой, это позволяет не запускать последующие шаги.

серверянин писал(а):Поэтому я хотел выяснить - не существует ли каких-нибудь других путей, может с API что-нибудь.

Кроме как «породить другой процесс, а самому скоропостижно умереть» — других подходов нет и быть не может. Другой вопрос, что при порождении другого процесса (дочернего) в качестве сигнала ему, что он дочерний, можно вместо ключа командной строки пользоваться другими средствами.

серверянин писал(а):Ведь сама утилита START это как-то же делала.

Нет такой утилиты. Это встроенная команда интерпретатора BAT-файлов, а не отдельная утилита. Тем не менее, если бы это была утилита, суть её работы заключалась бы просто в том, чтобы породить

серверянин писал(а):неизбежен ли перезапуск вторым экземпляром (с параметром или иными способами), или можно освободить текущий процесс, не закрывая его?

Ни малейшего шанса. Нет никакого «освобождения» — это целиком частная инициатива CMD.EXE — ждать, пока порождённый ею процесс не завершится и ничего не делать дальше, пока этого не произойдёт. CMD.EXE порождает новый процесс для твоей команды с помощью CreateProcess, а затем вызывает WaitForSingleObject, чтобы дождаться его перехода в терминированное состояние. Учитывая это, даже используя грязный хак и внедрившись из дочерней команды (то есть твоей программы) в адресное пространство CMD.EXE и делая там что угодно, никак нельзя прервать или отменить ожидание. Учитывая, что WaitForSingleObject переходит в режим ядра и оттуда не вернётся, пока процесс (идентифицируемый переданным хендлом) не перейдёт в нужное состояния, нет абсолютно никакого способа ни из вызванного процесса, ни из самого CMD.EXE прервать это ожидание. Даже таким грязным хаком, как SetThreadContext, поменяв EIP, не получится ровным счётом ничего, потому что это, во-первых, контекст пользовательского режима, и на контекст потока в режиме ядра это вообще никак не повлияет, а во-вторых, сам поток, вызвавший WaitForSingleObject, находится в состоянии wait:executive — это значит, что до перехода ожидаемого объекта в нужное состояния поток вообще не рассматривается планировщиком задач, планировщик задач вообще не переключается на этот поток, не даёт ему квантов процессорного времени. И поскольку WaitForSingleObject (в отличие от WaitForSingleObjectEx) не позволяет делать alertable wait, то и попытка прислать APC этому потоку, чтобы заставить его начать делать что-то другое (вместо ожидания), не сработает.

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

получилась страшная дребедень и я бросил тот вариант.

Значит, как-то криво делал.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

серверянин
Новичок
Новичок
 
Сообщения: 32
Зарегистрирован: 19.09.2023 (Вт) 8:00
Откуда: РФ

Re: Компиляция для .BAT ?

Сообщение серверянин » 26.01.2024 (Пт) 18:08

Хакер писал(а):
серверянин писал(а):Ведь сама утилита START это как-то же делала.

Нет такой утилиты. Это встроенная команда интерпретатора BAT-файлов, а не отдельная утилита.
Это в линейке NT ее встроили, а раньше (в WIN9x) это была самостоятельная утилита.

Но за подробнейшие разъяснения - большое спасибо!
Вопрос считаю проясненным, возможные варианты - обозначенными.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot], SemrushBot, Yandex-бот и гости: 36

    TopList