На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> Что есть ERRORLEVEL как таковой?
    Господа, объясните пожалуйста, что есть ERRORLEVEL по сути (не по назначению разумеется), правила образования, местоположение, время жизни...
    Спасибо..
      Хм.. насколько я помню, ERRORLEVEL существует только в досовском комманд.коме (в юниховых *sh он по-другому называется). Ты его имеешь в виду?..
        ну кароче это результат жизнедеятельности программы, который используется, чтобы дать понять другим программам, как прошло... ;-)
          Правило образования - значение регистра AL при выходе через AH=4Ch/INT 21h. При выходе через INT 20h, AH=0/INT 21h вроде как нулевой.... Храниться должен где-то в переменных ДОСа...... Срок жизни - до следующего запуска.....
            да перепробовал я энто всё.... не вытанцовывается...
            нужно запустить батник, в котором последовательно запускаются две программы:
            - одна устанавливает EL
            - вторая его проверяет и, в зависимости от энтого выполняет чего-то (прога типа IF ERRORLEVEL ...)
              А ты сделай прогу, которой в качестве параметра передаётся то, что нужно запустить и после чего нужно проверять ERRORLEVEL....
                нет важнее всего программа, которая ПРОВЕРЯЕТ EL...
                мне нужен, по правде говоря, только механизм отыскания и проверки EL, а применение сему я найду.
                Хуже, если EL уничтожается при ЗАПУСКЕ следующей программы... хотя, не должен бы...
                  Что такое errorlevel? По сути - переменная окружения, которая выставляется в командном режиме после выполнения каждой команды (любой). Поэтому и ловить ты его можешь только сразу после запуска программы. Но оно(она) какая-то неправильная переменная, потому что кроме как в батче и не видна. Вот. Херня какая.
                    Идея проста - если её что-то проверяет (ну пусть даже батник), то она где-то лежит....
                    Вопрос!!!  ГДЕ ЛЕЖИТ ... и В КАКОМ ВИДЕ ?
                      ERRORLEVEL - это просто макроопределение в великой могучей программе COMMAND.COM.
                      if errorlevel 5
                      означает: еси код, возвращённый вызванной программой _больше_ или равен 5, то.. Вот и всё. Вне COMMAND.COM (т.е. вне .bat-файлов) данная хрень не имеет абсолютно никакого значения. Это НЕ переменная окружения (мля, ну и перевод.. environment..)..
                        непонятки - программа, вызванная из COMMAND.com как виртуальный модуль, возвращает ей значение (ЗНАЧЕНИЕ ТИПА INTEGER) !!!! Сразу вопрос - КУДА ОНА ЕГО ПОМЕСТИЛА?
                        А ОНА ЕГО КУДА-ТО поместила, раз COMMAND.COM может его проверить.

                        повторюсь - ЭТО НЕ АСТРАЛЬНАЯ СУЩНОСТЬ - ЭТО ПЕРЕМЕННАЯ ТИПА INTEGER.

                        почему программа из ТОГО ЖЕ БАТНИКА не может проделать ТО ЖЕ, ЧТО И МАКРООПРЕДЕЛЕНИЕ ERRORLEVEL ???


                        а также... макроопределение есть ни что иное как набор команд процессора... (мнение ламера, разумеется  :) )
                        Сообщение отредактировано: Drew -
                          Ну.... во-первых, это переменная типа Byte.... :)
                          Во-вторых.... Если при запуске своей проги ты обнаруживаешь ноль, когда вызываешь ah=4Dh/int21h, значит этот ERRORLEVEL уничтожается до запуска проги! Логично? Так что тебе придётся только писать TSR-ку....
                          Кстати.... я тебя обрадовать хочу! После вызова ah=4Dh/int21h это самое значение уничтожается! :) Поэтому даже TSR-ка тебе может не помочь....
                            Попробую внести ясность. ERRORLEVEL - это не переменная, а, действительно, только макроопределение. Причём, если сделать if ERRORLEVEL 1, то эта хрень вернёт TRUE для значений, равных _и_больших_, чем единица. Почему её ниоткуда нельзя прочитать, кроме как из батника? А можно в асмовой проге написать IF EXIST xxx.yyy THEN?? ERRORLEVEL - эта хрень, принадлежащая исключительно комманд.кому. А вот почему ты не можешь прочитать собственно код возврата предыдующей проги:
                            "the word in which DOS stores the return code is cleared after being
                            read by this function, so the return code can only be retrieved once"
                            [Ralph Brown's Interrupt List, выпуск 61, раздел Int 21, Func 4D].
                            А т.к. COMMAND.COM читает этот код возврата (чтобы дать возможность узнать о нём батнику), код будет сброшен, и больше никто о нём не узнает.
                              Цитата Kernel Panic, 11.05.02, 18:57:53

                              [Int 21, Func 4D].
                              А т.к. COMMAND.COM читает этот код возврата (чтобы дать возможность узнать о нём батнику...


                              ну...ну... и ГДЕ батник (то есть COMMAND.COM) энто исчет и КАК определяет при обработке строки IF ERRORL... ?
                                Drew, смотри: комманд.ком - это интерпретатор. Вот он встречает в батнике строку, в которой его просят пустить какую-нить прогу. Он её пускает. Когда прога завершается, она возвращает управление комманд.кому, и тот проверяет, чё эта прога там вернула (int 21, ah=4D). И запоминает этот код возврата (где-то у себя в своих внутренних переменных). Потом продолжает интерпретировать батник. Следующей, скажем, идёт проверка ERRORLEVEL'a. Комманд.ком смотрит на свою переменную и принимает соответствующие действия.
                                  2 Drew: ERRORLEVEL уничтожается до запуска следующей команды....

                                  Более или менее подходящий способ для тебя - это сесть на ah=4Dh/int21h и сохранить этот код в своих внутренних переменных. А потом (при повторном запуске, скажем, с каким-нибудь ключём) выполнять то, что тебе нужно, выгрузив TSR из памяти :)
                                  Т.е:
                                  ExpandedWrap disabled
                                    @echo off<br>ТвояПрога /install<br>КакуюПрогуНадоПроверить<br>ТвояПрога /check

                                  Или (что ещё лучше) сделать программу, которая запускает прогу, указананную в коммандной строке (только напрямую, не через COMMAND.COM /C), а потом проверять код....
                                  Сообщение отредактировано: 7in -
                                    бредовая мысль - есть программы, преобразующие BAT в COM .... как у них
                                    с ErrorLevel? .... если 'хорошо', то ... :)
                                      ... ага... ВОТ!!!!

                                      DOS сохраняет полученный ею код возврата завершившегося процесса в одной из системных таблиц до тех пор, пока его не затребует родительская программа. После этого код возврата сбрасывается.
                                      Если программа запускается с клавиатуры (командой оператора), родительским процессом является COMMAND.COM, котрый и принимает код завершения (и, впрочем, НИЧЕГО с ним не делает)....

                                                                                  К.Г.Финогенов. Самоучитель по системным функциям MS-DOS 3-е издание, стр 186.

                                      ГДЕ ТА САМАЯ "СИСТЕМНАЯ ТАБЛИЦА"?
                                        Ну какая тебе разница?! После COMMAND.COM'а там всё равно будет ноль!!!
                                          Drew, ну.. есть int 21, функция 52 (всё 16-ричное). Читай Ральфа Брауна. Но, поверь мне, это извращение. Легче просто написать прогу, которая пускала бы соответствующие проги. Зачем тебе всё это нужно, кстати?
                                            Цитата Kernel Panic, 22.05.02, 00:07:46
                                            Легче просто написать прогу, которая пускала бы соответствующие проги. Зачем тебе всё это нужно, кстати?


                                            Всё просто - ГЛАВНОЕ (и, пожалуй единственное) преимущество пакетного файла (BAT), что он не нуждается в перекомпиляции и довольно быстро модифицируется даже не слишком искушенным программером.

                                            я по работе часто сталкиваюсь в такими ситуёвинами, что меняется состав программ, возвращающих ERRORLEVEL, да и памяти для программы, возвращающей EL просто нет, чтобы запустить её как виртуальный модуль (spawnXXX)

                                            поэтому приходится общаться через окружение COMMAND.com или ERRORLEVEL

                                            ДА ! О ПТИЧКАХ ! Оставим мелкомягким ИХ проблемы с ERRORLEVEL !

                                            КТО ЗНАЕТ, КАК ПОПАСТЬ В MCB COMMAND.COM, чтобы изменить КОРЕННУЮ ПЕРЕМЕННУЮ ОКРУЖЕНИЯ, А НЕ ЕЁ КОПИЮ!??
                                              Вызываешь ah=52h/int21h, далее делаешь mov es,es:[bx-2], получаешь в es адрес первого MCB, далее сканнируешь их и ищешь Environment COMMAND.COM'а :)
                                              Сообщение отредактировано: 7in -
                                                Всё было бы чудно, ежели бы не эта НЕДОКУМЕНТИРОВАННАЯ функция.... она возвращает адрес списка списков  по ES:[BX] !!!
                                                а вот ЧТО она возвращает по ES:[BX-2] ???
                                                поясни, пожалуйста. Я посмотрел - там ES:[BX-2] ваще бредятина какая-то... которая НИКУДА не указывает...  :-[
                                                Сообщение отредактировано: Drew -
                                                  В es:[bx-2] находится сегмент первого MCB (1 слово).... Это есть в TechHelp'е....
                                                  Сообщение отредактировано: 7in -
                                                    про адрес сегмента и про то, что МСВ выравнивается по границе этого сегмента, я в курсах, только я также знаю структуру МСВ, а то, что ТАМ - ни на что не похоже...

                                                    25.05.2002

                                                    Посмотрел внимательнее... ТАМ МСВ типа М (не ПОСЛЕДНИЙ то есть) и НЕ MCB COMMAND.COM... потом нашел FCB COMMAND.COM, но сменить переменную окружения так и не удалось.... то есть сменил, но, по команде SET на экран выползли СТАРЫЕ значения переменных...
                                                    Сообщение отредактировано: Drew -
                                                    1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                                    0 пользователей:


                                                    Рейтинг@Mail.ru
                                                    [ Script execution time: 0,0468 ]   [ 14 queries used ]   [ Generated: 17.05.24, 20:05 GMT ]