Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: как в програме вызвать приложение с параметрами и обработать код ошибки  (Прочитано 14884 раз)
0 Пользователей и 1 Гость смотрят эту тему.
inf158704
Участник

ru
Offline Offline

« : 04-03-2015 07:13 » new

при запуске програмы через бат вайл

jre\bin\java.exe -cp microemulator.jar;lib/microemu-jsr-75.jar;apps/Opera_Mini_8.0.jar org.microemu.app.Main --impl org.microemu.cldc.file.FileSystem org.microemu.examples.fcview.FCViewMIDlet Browser --quit >log

получаю log следующего вида

arguments [[--impl], [org.microemu.cldc.file.FileSystem], [org.microemu.examples.fcview.FCViewMIDlet], [Browser], [--quit]]
     org.microemu.app.Main.main(Main.java:1024)
implementation registered [org.microemu.cldc.file.FileSystem]
     org.microemu.app.Common.registerImplementation(Common.java:664)

при ошибке добавляеться (попытка открытия файла) добавляеться следующее

Message: info: MIDlet requests that the device handle the following URL: rtsp://r7---sn-4g57kuez.googlevideo.com/Ck0LENy73wIaRAnnv56Y-UxVShMYDSANFC2qpfZUMOCoAUIJbXYtZ29vZ2xlSARSBXdhdGNoYLf-ht-w6Ij6VIoBC2FGNUh5X1pCRzF3DA==/55D342ADD05A90E21FF1EAB5DBFF699115EAE154.34BCE14633E4816FF9EAB5AA4109D67FC6A716CF/yt5/1/video.3gp
     org.microemu.app.Common$2.run(Common.java:476)

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

похоже самые болшие проблемы будет с путями и вообще вызове с параметрами

Записан
darkelf
Молодой специалист

no
Offline Offline

« Ответ #1 : 04-03-2015 11:33 » 

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

похоже самые большие проблемы будет с путями и вообще вызове с параметрами

В *.bat файлах есть возможность проверить именно код завершения. После выполнения каждой команды из *.bat-файла формируется переменная окружения ERROR_LEVEL, содержащая код её завершения. Обычно 0-вой код это нормальное завершение, а все остальные - какая-либо ошибка. Средствами cmd.exe есть возможность проанализировать этот код см. справку по команде if (WIN+R cmd <enter> help if). В Вашем случае, если я правильно понимаю, Вы хотите проанализировать всё-таки не код завершения, а вывод программы, что можно тоже сделать, воспользовавшись командами if и findstr
Записан
inf158704
Участник

ru
Offline Offline

« Ответ #2 : 04-03-2015 13:18 » 



В *.bat файлах есть возможность проверить именно код завершения. После выполнения каждой команды из *.bat-файла формируется переменная окружения ERROR_LEVEL, содержащая код её завершения. Обычно 0-вой код это нормальное завершение, а все остальные - какая-либо ошибка. Средствами cmd.exe есть возможность проанализировать этот код см. справку по команде if (WIN+R cmd <enter> help if). В Вашем случае, если я правильно понимаю, Вы хотите проанализировать всё-таки не код завершения, а вывод программы, что можно тоже сделать, воспользовавшись командами if и findstr
 

я даже об этом не подумал но имено вывод програмы мне и будет нужен... В этом случае мне придется вызывает все это еще и через cmd иначе похоже никак и его вывод анализировать... Хотя конешно сама эта програма вызывает окно с информацией о неверном URL но его я уж точно несмогу перехватить 
Записан
darkelf
Молодой специалист

no
Offline Offline

« Ответ #3 : 04-03-2015 13:38 » 

я даже об этом не подумал но именно вывод программы мне и будет нужен... В этом случае мне придется вызывает все это еще и через cmd иначе похоже никак и его вывод анализировать... Хотя конечно сама эта программа вызывает окно с информацией о неверном URL но его я уж точно не смогу перехватить 
если программа выводит сообщения об ошибках в консоль, то Вы можете проанализировать её сообщения, запустив вывод через pipe, если надо проверять несколько сообщений, то можно сохранить её сообщения во временный рабочий файл (как Вы и сделали, указав перенаправление вывода ">log") и дальше этот файл протокола проанализировать хоть командами findstr с if, хоть своей самописной программой на любом языке программирования, позволяющего читать строки из файла и анализировать их.

При запуске *.bat-файла командный интерпретатор cmd.exe (или command.com) уже запускается и дополнительно его запускать обычно не надо.
Записан
inf158704
Участник

ru
Offline Offline

« Ответ #4 : 05-03-2015 08:54 » 

darkelf, судя по описанию https://ru.wikipedia.org/wiki/Именованный_канал как раз pipe можно исползовать для анализа всех сообщений и как я понимаю наиболее понятный способ для этого но наибменне реальный для меня это организация виртуального ком порта...
ананилз через log возможен только с закрытием програмы что конешно совсем нехорошо, но хотябы решабельно и представит из себя вызов приложения в bat файле для анализа, а если хорошо подумать возможно и в самом bat файле можно все провернуть... буду думать спасибо за помощ... хотябы буду представлять теперь как работает вызовы в командной строке
Записан
darkelf
Молодой специалист

no
Offline Offline

« Ответ #5 : 05-03-2015 09:16 » 

darkelf, судя по описанию https://ru.wikipedia.org/wiki/Именованный_канал как раз pipe можно использовать для анализа всех сообщений и как я понимаю наиболее понятный способ для этого но наименее реальный для меня это организация виртуального ком порта...
анализ через log возможен только с закрытием программы что конечно совсем нехорошо, но хотя-бы решабельно и представит из себя вызов приложения в bat файле для анализа, а если хорошо подумать возможно и в самом bat файле можно все провернуть...
В случае *.bat-Файла  канал не именованный, т.е. запуск будет выглядеть следующим образом:
Код:
my_prog.exe | log_analyzer.exe
в случае с перенаправлением в файл:
Код:
my_prog.exe > log
log_analyzer.exe < log
в случае перенаправления файла да, придётся дожидаться завершения программы my_prog, в случае канала - нет, но там может быть проблема с буферизацией вывода программы - пока не наберётся определённое количество данных этот вывод может не попадать на вход второй программы (log_analyzer), а как наберётся - будет приходить сразу пачкой.
Записан
inf158704
Участник

ru
Offline Offline

« Ответ #6 : 08-04-2015 12:34 » 

уважаемые форумчане, прошу подсказать где моя ошибка
Код:
#include "stdafx.h" // незнаю зачем

#include <stdio.h>
#include <string.h>
#include <iostream>

//#include <string>  
 
using namespace std;
 
int main ()
{

char stf[255] = "URL: rtsp:"; // stf - что ищем
char fpath[255] = "c:\\3"; //fpath - путь к файлу
char str[15000]; //str - для поиска в строке (пока не требуеться)
char *c; // РЕЗУЛЬТАТ ПОИСКА
FILE * file; //файл
    //int i=0;
    str[0]='\0';
cout << fpath << endl;
file = fopen(fpath, "r+");
   
    while( file == NULL ) // если файл не найден ввод с клавиатуры
    {
        cout << endl << "Wrong!" << endl << "Enter exist file location: ";
        gets(fpath);
         cout << endl;
        file = fopen(fpath, "r+");
    }
 
    /*cout << "Enter text to find: ";
    gets(stf); //ввод с клавиатуры сочетания поиска при необходимости*/

cout << endl;
    while (!feof(file))
    {
fgets(str, 15000, file);
        c = strstr (str, stf);
    }
    if (c == NULL)
        cout<<"The word is NOT in the file!"<<endl;
    else
        cout<<"The word is in the file!"<<endl;
cout<<c;
 
    fclose(file);
gets(fpath); //пауза
    return 0;
}
вот нашел и надеялся мне круто повезло, но:
Цитата
Функция fgets читает строку из входного потока stream и
располагает ее в string. Символы считываются, начиная с текущей
позиции stream, до символа новой строки '\n' или до конца потока,
либо пока число считанных символов не станет равным n-1. Резуль-
тат размещается в string, а затем к нему добавляется символ null
-'\0'. Символ новой строки также включается в string. Если в нача-
ле считывания n равнялось 1, то string будет пустой (""). Функция
fgets аналогична библиотечной функции gets, однако, gets заменяет
символ новой строки нулевым символом.
почемуто в файле с содержанием

Код:
Message: info: MIDlet requests that the device handle the following URL: rtsp://r2---sn-4g57kued.googlevideo.com/1/video.3gp
 org.microemu.app.Common$2.run(Common.java:476)
програма дает ошибку, видимо или невидит или не обращат внимание на конец строки, а может в файле у меня его нет... както можно обойти проблему чтобы брала только ссылку?
« Последнее редактирование: 08-04-2015 12:40 от inf158704 » Записан
darkelf
Молодой специалист

no
Offline Offline

« Ответ #7 : 08-04-2015 12:44 » 

почему-то в файле с содержанием
Код:
Message: info: MIDlet requests that the device handle the following URL: rtsp://r2---sn-4g57kued.googlevideo.com//video.3gp
 org.microemu.app.Common$2.run(Common.java:476)
программа дает ошибку, видимо или не видит или не обращает внимание на конец строки
какую ошибку даёт Ваша программа? Вы не привели, что Ваша программа ищет в этом файле.
Плюс ко всему - попробуйте не смешивать стандартную библиотеку C++ (cout, endl) и стандартную библиотеку C (fopen(), fgets(), gets()).
Ну и по стилю - лучше либо 15000 вынести в константу, либо, что предпочтительней, сказать в
Код: (C)
   while (!feof(file))
    {
        fgets(str, sizeof(str), file);
        c = strstr (str, stf);
    }
а по существу - проверять результат strstr() надо в цикле, т.е.
Код: (C)
   while (!feof(file))
    {
        fgets(str, sizeof(str), file);
        c = strstr (str, stf);
        if (c != NULL)
          break;
    }
     if (c == NULL)
        printf("The word is NOT in the file!\n");
    else
        printf("The word is in the file!\n");
« Последнее редактирование: 08-04-2015 12:53 от darkelf » Записан
inf158704
Участник

ru
Offline Offline

« Ответ #8 : 08-04-2015 13:03 » 

ищу это
Цитата
char stf[255] = "URL: rtsp:"; // stf - что ищем...
мне нужно чтобы захватило всю ссылку rtsp://r2---sn-4g57kued.googlevideo.com//video.3gp и отбросило хвост

в окне ошибка с текстом Unhandled exception at 0x5d98f8e0 in поиск слова в файле.exe: 0xC0000005: Access violation reading location 0x00000000.

я конечно не совсем понял, почему имено в цикле должен быть поиск результата...
спасибо все работает... буду разбираться дальше
« Последнее редактирование: 08-04-2015 13:42 от inf158704 » Записан
darkelf
Молодой специалист

no
Offline Offline

« Ответ #9 : 09-04-2015 06:25 » 

я конечно не совсем понял, почему именно в цикле должен быть поиск результата...
чтение из файла происходит по строкам. без break, как было в Вашем случае сначала fgets() вычитывает в переменную str строку
Код:
Message: info: MIDlet requests that the device handle the following URL: rtsp://r2---sn-4g57kued.googlevideo.com//video.3gp
затем strstr() находит в ней подстроку "rtsp://" и сохраняет признак нахождения в переменной c.  потом происходит переход на начало цикла и в str считывается следующая строка:
Код:
  org.microemu.app.Common$2.run(Common.java:476)
в которой искомой подстроки уже нет. т.к. больше строк с подстрокой rtsp:// в файле нет, то общим результатом оказывался результат последнего поиска.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines