Get exit code - Получить код завершения работы стороннего приложения

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Developer
Ветеран
Сообщения: 551
Зарегистрирован: 26 Март 2012, 17:18

Get exit code - Получить код завершения работы стороннего приложения

Сообщение Developer »

Дед Пахом писал(а): Если нужно только распарсить вывод ipconfig, то тебе сюда - получение информации об адаптерах.
Михаил, спасибо за помощь!
ipconfig /all всего лишь общий пример понять принцип получения данных по результату работы стороннего (часто консольного) приложения.
RaFaeL писал(а): Интересно, а ты сам как Developer (т.е. разработчик) вообще что-то пишешь? )
Если даже распарсить текстовый файл пример нужен
Rafael, ты ведь тоже спрашиваешь - для того и создан форум :D

http://forum.clarionlife.net/phpbb/view ... 65&p=27774

Хороший пример, никогда лишним не бывает :wink:
С Уважением, Developer
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1411
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

Get exit code - Получить код завершения работы стороннего приложения

Сообщение RaFaeL »

Я задаю те вопросы, ответы на которые не могу найти в сети, в справке, в архиве на форуме. Или когда что-то не получается, какие-то нюансы. А "пример, как распарсить файл" это чушь. Объявляешь файл как DOS, читаешь построчно, далее с этой строковой переменной работаешь, хоть посимвольно, хоть через instring, хоть еще как, никакого общего примера тут быть не может так как никто кроме тебя не знает что там в файле будет, может "Война и мир" Толстого, например. Ну вот тебе пример из нашего проекта, че-то там читается из стороннего текстового файла

Код: Выделить всё

MEMGRP               FILE,DRIVER('DOS'),NAME(GLO:FileMem),PRE(MEM),CREATE,BINDABLE,THREAD
Record                   RECORD,PRE()
Field                       BYTE
                         END
                     END

Код: Выделить всё

      set(memgrp)
      loop
        next(memgrp)
        if errorcode() or chr(mem:field)<>'G' then break.
        loop i#=1 to 11
          if mem:field=0
            MM:Name[i#]=' '
          else
            MM:Name[i#]=chr(mem:field)
          end
          next(memgrp)
        end
        loop i#=1 to 21
          next(memgrp)
        end
        loop i#=1 to 5
          if mem:field=0
            MM:Group[i#]=' '
          else
            MM:Group[i#]=chr(mem:field)
          end
          next(memgrp)
        end
        add(MemQ)
      end
Легче стало? ))

P.S. Хотя, возможно, это бинарный файл, но разницы, в целом, нет

P.P.S. Я не программист, если что )
Developer
Ветеран
Сообщения: 551
Зарегистрирован: 26 Март 2012, 17:18

Get exit code - Получить код завершения работы стороннего приложения

Сообщение Developer »

Rafael - спасибо! :D

Вот это пример помощи на форуме!
С Уважением, Developer
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Get exit code - Получить код завершения работы стороннего приложения

Сообщение Дед Пахом »

В этом конкретном случае драйвер ASCII явно лучше, чем DOS.

PS. А я - электрик-ремонтник трамвайного оборудования 2-го разряда. Кроме шуток.
С уважением, ДП
Developer
Ветеран
Сообщения: 551
Зарегистрирован: 26 Март 2012, 17:18

Get exit code - Получить код завершения работы стороннего приложения

Сообщение Developer »

Получить значения для переменных Clarion из результата работы и ответа консольного приложения:

ipconfig /all - условный пример

Настройка протокола IP для Windows

Имя компьютера . . . . . . . . . : PC
Основной DNS-суффикс . . . . . . :
Тип узла. . . . . . . . . . . . . : Смешанный
IP-маршрутизация включена . . . . : Нет
WINS-прокси включен . . . . . . . : Нет

Ethernet adapter Сетевое подключение Bluetooth 4:

Состояние среды. . . . . . . . : Среда передачи недоступна.
DNS-суффикс подключения . . . . . :
Описание. . . . . . . . . . . . . : Устройства Bluetooth (личной сети) #4
Физический адрес. . . . . . . . . : 00-0E-E7-50-0D-B8
DHCP включен. . . . . . . . . . . : Да
Автонастройка включена. . . . . . : Да

Ethernet adapter Подключение по локальной сети:

DNS-суффикс подключения . . . . . :
Описание. . . . . . . . . . . . . : Realtek PCIe GBE Family Controller
Физический адрес. . . . . . . . . : 00-1F-D0-22-2B-66
DHCP включен. . . . . . . . . . . : Нет
Автонастройка включена. . . . . . : Да
Локальный IPv6-адрес канала . . . : fe81::1156:c029:efa6:164a%11(Основной)
IPv4-адрес. . . . . . . . . . . . : 192.168.1.3(Основной)
Маска подсети . . . . . . . . . . : 255.255.255.0
Основной шлюз. . . . . . . . . : 192.168.1.7
IAID DHCPv6 . . . . . . . . . . . : 234889161
DUID клиента DHCPv6 . . . . . . . : 00-01-00-01-1C-60-49-6D-00-1F-D0-22-2B-66
DNS-серверы. . . . . . . . . . . : 8.8.8.8
8.8.8.8
NetBios через TCP/IP. . . . . . . . : Включен

Туннельный адаптер isatap.{C00D8548-7A0E-4A34-A9DD-0489D0E89496}:

Состояние среды. . . . . . . . : Среда передачи недоступна.
DNS-суффикс подключения . . . . . :
Описание. . . . . . . . . . . . . : Адаптер Microsoft ISATAP #3
Физический адрес. . . . . . . . . : 00-00-00-00-00-00-00-E0
DHCP включен. . . . . . . . . . . : Нет
Автонастройка включена. . . . . . : Да

Туннельный адаптер isatap.{F0E306F8-0821-44D4-8981-B8F82A76DC56}:

Состояние среды. . . . . . . . : Среда передачи недоступна.
DNS-суффикс подключения . . . . . :
Описание. . . . . . . . . . . . . : Адаптер Microsoft ISATAP #5
Физический адрес. . . . . . . . . : 00-00-00-00-00-00-00-E0
DHCP включен. . . . . . . . . . . : Нет
Автонастройка включена. . . . . . : Да

Туннельный адаптер Teredo Tunneling Pseudo-Interface:

DNS-суффикс подключения . . . . . :
Описание. . . . . . . . . . . . . : Teredo Tunneling Pseudo-Interface
Физический адрес. . . . . . . . . : 00-00-00-00-00-00-00-E0
DHCP включен. . . . . . . . . . . : Нет
Автонастройка включена. . . . . . : Да
IPv6-адрес. . . . . . . . . . . . : 2001:1:9d31:90d7:14c3:8057:da29:f48d(Основной)
Локальный IPv6-адрес канала . . . : fe10::14c3:8057:da29:f48d%37(Основной)
Основной шлюз. . . . . . . . . : ::
NetBios через TCP/IP. . . . . . . . : Отключен

К примеру, как получить в переменные Clarion GateName & GateIPAddres из всего этого условного текста примера:

GateName GateIPAddres
Основной шлюз. . . . . . . . . : 192.168.1.7
Здесь IP Адрес - условное значение может быть любой строкой произвольной длины) :wink:

VariableFixedLegth Value Variable Legth
Определённый тест.................... неопределённое значение произвольной длины

Как найти определённое значение сопоставимой с переменной значением и записать в переменную Clarion значение переменной неопределённой длины?

Типа того:

VariableFixedLegth - это Определённый тест....................

ValueVariableLegth = 'неопределённое значение произвольной длины'

VariableFixedLegth = ValueVariableLegth

Может кто решал такую задачу?
Последний раз редактировалось Developer 13 Март 2017, 1:38, всего редактировалось 5 раз.
С Уважением, Developer
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1411
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

Get exit code - Получить код завершения работы стороннего приложения

Сообщение RaFaeL »

Дед Пахом писал(а): В этом конкретном случае драйвер ASCII явно лучше, чем DOS.
Да, наверное, не тот пример нарыл. Вот другой, тут прям текстовый текстовый

Код: Выделить всё

TXT                  FILE,DRIVER('ASCII'),NAME(GLO:PathFile),PRE(TXT),CREATE,BINDABLE,THREAD
Record                   RECORD,PRE()
Field                       STRING(255)
                         END

Код: Выделить всё

importtxt routine

  free(TXTQ)
  clear(TXTQ)
  GLO:PathFile=clip(LOC:PathImport)
  TXT{PROP:OEM}=LOC:OEMimport
  open(TXT)
  doc#=0
  set(TXT)
  loop
    next(TXT)
    if errorcode() then break.
    a#=instring('=',TXT:Field,1,1)
    b#=len(clip(TXT:Field))
    if a#>1 and b#>a#
      TXTQ:Rec=lower(TXT:Field[1 : a#-1])
      TXTQ:Val=TXT:Field[a#+1 : b#]
      if lower(clip(TXTQ:Rec))='секциядокумент'
        doc#+=1
      end
      if lower(clip(TXTQ:Rec))='расчсчет' and doc#=0
        RSQ.RSchet=clip(TXTQ:Val)
        add(RSQ)
      else
        TXTQ:Doc=doc#
        add(TXTQ)
      end
    end
  end

  sort(TXTQ,TXTQ:Doc,TXTQ:Rec)
  sort(RSQ,+RSQ.RSchet)

  loop LOC:Rec=1 to doc#
    LOC:DAT=deformat(clip(getval('дата',LOC:Rec)),@d6.)
    if ~LOC:Dat then cycle.
    if getval('Сумма',LOC:Rec)=0 then cycle.
    RSQ.RSchet=getval('ПлательщикСчет',LOC:Rec)
    get(RSQ,+RSQ.RSchet)
    if errorcode()
      LOC:NameFile='oplata'
      LOC:Pre='Плательщик'
    else
      LOC:NameFile='oplatan'
      LOC:Pre='Получатель'
    end

    LOC:OKPO_I=getval(LOC:Pre&'ИНН',LOC:Rec)
    LOC:Name_I=getval(LOC:Pre&'1',LOC:Rec)
    if clip(LOC:Name_I)='' then LOC:Name_I=GetName(clip(getval(LOC:Pre,LOC:Rec))).
    LOC:Count_I=getval(LOC:Pre&'Счет',LOC:Rec)
    LOC:Bank_I=getval(LOC:Pre&'Банк1',LOC:Rec)
    LOC:KorrSchet=getval(LOC:Pre&'Корсчет',LOC:Rec)
    LOC:KPP=getval(LOC:Pre&'КПП',LOC:Rec)
    ...

Код: Выделить всё

GetVal procedure(string Rec_, long Doc_)

 code

  TXTQ:Rec=lower(clip(Rec_))
  TXTQ:Doc=Doc_
  get(TXTQ,+TXTQ:Doc,+TXTQ:Rec)
  if errorcode()
    return ''
  else
    return TXTQ:Val
  end
  
GetName procedure(string Name_)

 code

  a#=instring(clip(LOC:OKPO_I),Name_,1,1)
  if a#=0
    return Name_
  else
    b#=instring(' ',Name_,1,a#)
    if b#
      return Name_[b#+1 : len(Name_)]
    else
      return ''
    end
  end
Это импорт из клиент-банка, например
Developer
Ветеран
Сообщения: 551
Зарегистрирован: 26 Март 2012, 17:18

Get exit code - Получить код завершения работы стороннего приложения

Сообщение Developer »

Rafael, благодарю за помощь и примеры! :D
С Уважением, Developer
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1411
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 12 раз
Поблагодарили: 2 раза
Контактная информация:

Get exit code - Получить код завершения работы стороннего приложения

Сообщение RaFaeL »

Developer писал(а): VariableFixedLegth Value Variable Legth Определённый тест.................... неопределённое значение произвольной длиныКак найти определённое значение сопоставимой с переменной значением и записать в переменную Clarion значение переменной неопределённой длины?Типа того:VariableFixedLegth - это Определённый тест....................VariableFixedLegth = 'неопределённое значение произвольной длины'Может кто решал такую задачу?
Получаешь в текстовую переменную Str строку из файла
Ищешь в этой строке первую точку и первое двоеточие допустим через instring это будут допустим n# и m#
Соответственно имя будет Str[1 : n#-1] и значение будет Str[m#+2 : len(clip(str))]
Только не забыть всякие разные проверки вида "а не пусто ли после двоеточия" а то вылетит

P.S. Другая программа может выдавать совершенно в другом формате всё, и там будут например не двоеточия, а символы табуляции, да все что угодно
kreator
✯ Ветеран ✯
Сообщения: 5159
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Get exit code - Получить код завершения работы стороннего приложения

Сообщение kreator »

Вопрос к Developer'у. А если не абстрактные примеры, что реально нужно? Я к тому, что может есть смысл вытягивать инфу, скажем, из реестра. А не распарсивать непонятно что.
We are hard at work… for you. :)
Developer
Ветеран
Сообщения: 551
Зарегистрирован: 26 Март 2012, 17:18

Get exit code - Получить код завершения работы стороннего приложения

Сообщение Developer »

Kreator, привет!

Как правило, если необходимо узнать информацию на локальном компьютере, тогда да лучше
получить данные из реестра. В этом ты прав. :wink:

А вот если необходимо получить информацию с удалённого хоста – на удалённом хосте может быть заблокирована служба удалённого реестра. :mrgreen:

Вот конкретно необходимо :

1) Выполнить команду Ping и обработать результат её работы (написать сообщение для пользователя в случае отсутствия доступа к хосту сервера).

2) Выполнить команду dblocate.exe (SAP Sybase SQL Anywhere) – узнать IP адрес хоста на котором работает сервер SAP Sybase SQL Anywhere и результат работы передать приложению Clarion.

3) Выполнить команду XCOPY и передать приложению Clarion - скопировано N файлов.

А в общем, решение этой задачи существенно поможет при взаимодействии как со встроенными утилитами командной строки ОС Windows так и сторонними консольными приложениями. :D
С Уважением, Developer
Алексей- Софт-Центр
Ветеран
Сообщения: 390
Зарегистрирован: 26 Август 2009, 12:41
Откуда: Moscow
Контактная информация:

Get exit code - Получить код завершения работы стороннего приложения

Сообщение Алексей- Софт-Центр »

Добрый день.
Developer!
1. В данном Вашем подходе к решению таких задач, Вы можете их решать только:
- написав для каждой свой обработчик ( никакого общего решения)
- обработчик пишется по "масочному" принципу: определяете уникальную последовательность символов во входном потоке (маску) за которой следует необходимые Вам данные. Аналогично должны определять и маску окончания данных, ну, или знать их длины. С помощью instring sub .... Вытаскиваете данные в переменные. Такой обработчик имеет право на жизнь, но Вы должны предусмотреть все варианты винды, в том числе и англо/Русские варианты.
- если для решения возможно потребуется разборка логики входного потока, то Вам необходимо будет разбираться с такими понятиями как Польская запись, стеки, одно и дву направленные списки и т од.
2. Естественно, что говорить и обсуждать надо конкретную команду с конкретным набором параметров, а не просто обо всем-ни о чем.

У нас есть продукт (ImageExplorer) - у которого на входе файл (диск.флешка,...) а на выходе логическая структура -папки, файлы и т д.
При этом совершенно разная логика для нтфс и фат, например.


Алексей.
Developer
Ветеран
Сообщения: 551
Зарегистрирован: 26 Март 2012, 17:18

Get exit code - Получить код завершения работы стороннего приложения

Сообщение Developer »

Алексей, спасибо за понимание и адекватный ответ! :D

Как раз так и поступил в своём пробном экспериментальном варианте ещё до Вашего сообщения и сейчас убедился в правоте Вашего сообщения после своего эксперимента.

Эксперимент удался (спасибо за помощь Деду Пахому (Михаилу) и Rafael-у) - результат получил - но он не универсален: новая версия утилиты командной строки и всё - алгоритм получения переменных не работает :(
Алексей- Софт-Центр писал(а): У нас есть продукт (ImageExplorer) - у которого на входе файл (диск.флешка,...) а на выходе логическая структура -папки, файлы и т д.
При этом совершенно разная логика для нтфс и фат, например.
Где скачать для ознакомления?
С Уважением, Developer
Алексей- Софт-Центр
Ветеран
Сообщения: 390
Зарегистрирован: 26 Август 2009, 12:41
Откуда: Moscow
Контактная информация:

Get exit code - Получить код завершения работы стороннего приложения

Сообщение Алексей- Софт-Центр »

Добрый день.
ImageExplorer - программа бесплатная. Она идёт в добавок к остальным программам по восстановлению данных.
Скачать здесь:
http://www.flash-extractor.com/downloads/

Алексей
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Get exit code - Получить код завершения работы стороннего приложения

Сообщение Admin »

А из IPHLPAPI.DLL дернуть данные через API не получится?
2017-03-15_17-22-27.png
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Get exit code - Получить код завершения работы стороннего приложения

Сообщение Дед Пахом »

Admin писал(а): А из IPHLPAPI.DLL дернуть данные через API не получится?
Я уже давал в этой теме ссылку на готовый класс iphlpapi, но ему же нужно универсальное решение для "распарсить всё!"
С уважением, ДП
Ответить