Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как убрать "подвешивание" вызывающего приложения при вызове другого через Shell? / 24 сообщений из 24, страница 1 из 1
03.07.2013, 16:43
    #38319152
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать "подвешивание" вызывающего приложения при вызове другого через Shell?
Пример кода:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Public Sub mnuTrayLogBook_Click()
  Dim hwndTarget As Long
  hwndTarget = FindMyWindow(1) 'WINDOWTITLE_LOGBOOK
  If hwndTarget = 0 Then
    If Len(Dir(App.Path & "\logbook.exe")) > 0 Then _
     Shell App.Path & "\logbook.exe", vbNormalFocus
  Else
    If IsIconic(hwndTarget) Then ShowWindow hwndTarget, SW_RESTORE
    SetForegroundWindow hwndTarget
  End If
End Sub


Смысл кода:
если logbook.exe запущен то окно запущенного экземпляра просто выводится наверх
если НЕТ, то logbook.exe запускается через Shell

Есть проблемка. Если например logbook.exe запускается ощутимо долго (3 секунды к примеру - ну скажем listview c 4000 записей), то вызывающее приложение стормозит пока logbook.exe не запустится.
Если вызывающее приложение например проигрывает wav-файл, то проигрывание будет прервано на время запуска вызываемого, фигня, но по ушам ездит.

Как полечить?

Второй неприятный эффект в таком же духе.
Например посылаю SendMessage (data) в вызываемое приложение.
Если в процедура обработки в вызываемом приложении требует какого-то времени, то опять же в вызывающем приложении будет подвисание.

Как лечить? PostMessage вместо SendMessage? Ну, если ответа не требуется?
...
Рейтинг: 0 / 0
03.07.2013, 17:02
    #38319213
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать "подвешивание" вызывающего приложения при вызове другого через Shell?
Используйте асинхронный запуск. Скажем, через WSHShell.Run.
...
Рейтинг: 0 / 0
03.07.2013, 17:08
    #38319228
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать "подвешивание" вызывающего приложения при вызове другого через Shell?
AkinaИспользуйте асинхронный запуск. Скажем, через WSHShell.Run.или через ShellExecute
...
Рейтинг: 0 / 0
03.07.2013, 17:09
    #38319235
ZVI
ZVI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать "подвешивание" вызывающего приложения при вызове другого через Shell?
Дмитрий77Если например logbook.exe запускается ощутимо долго (3 секунды к примеру - ну скажем listview c 4000 записей), то вызывающее приложение стормозит пока logbook.exe не запустится.
А разве не "the Shell function runs other programs asynchronously"?
Если запускаемая программа в начале сжирает ресурсы процессора, тогда, наверное, нужно как-то понижать её приоритетность.
Но если почему-то Shell долго формирует task ID, то можно попробовать сформировать BAT-файл и уже его запускать шеллом.
...
Рейтинг: 0 / 0
03.07.2013, 17:11
    #38319236
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать "подвешивание" вызывающего приложения при вызове другого через Shell?
bat-файл с вызовом через call решит проблему
...
Рейтинг: 0 / 0
03.07.2013, 17:16
    #38319246
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать "подвешивание" вызывающего приложения при вызове другого через Shell?
AkinaWSHShell.Run.
Никогда не использовал и не люблю такие штуки
Shocker.Proили через ShellExecute
Да, уже об этом подумал. Можно попробовать Но ShellExecute это не то же самое что Shell? Небось также ждет результата. Нет?
Konst_Onebat-файл с вызовом через call решит проблему
Вот не хотелось бы лепить эти методы (хоть и проверенные временем) в свою "культурную" программу.
start тоже бы не хотелось
М.б. тупо cmd?
...
Рейтинг: 0 / 0
03.07.2013, 17:20
    #38319257
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать "подвешивание" вызывающего приложения при вызове другого через Shell?
DoEvents мож куда воткнуть?
...
Рейтинг: 0 / 0
03.07.2013, 17:29
    #38319278
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать "подвешивание" вызывающего приложения при вызове другого через Shell?
ZVIесли почему-то Shell долго формирует task IDИменно.

Konst_Onebat-файл с вызовом через call решит проблемуУгу. Но некрасиво. Да и технология древняя дюже - BAT/CMD... чё тогда не VBS/JS, скажем? а если VBS - то какая нафиг разница, через Call или через WSHShell.Run?

Дмитрий77AkinaWSHShell.Run.
Никогда не использовал и не люблю такие штуки
Shocker.Proили через ShellExecute
Да, уже об этом подумал.Т.е. либо одна крайность, либо другая, а вот серединку - ни-ни... ну можно и так.

Дмитрий77DoEvents мож куда воткнуть?
*ROFL*
...
Рейтинг: 0 / 0
03.07.2013, 17:31
    #38319281
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать "подвешивание" вызывающего приложения при вызове другого через Shell?
doevents воткнуть внутрь shell - это конечно забавно, но все варианты уже предложили, выбирай
...
Рейтинг: 0 / 0
03.07.2013, 17:32
    #38319284
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать "подвешивание" вызывающего приложения при вызове другого через Shell?
Дмитрий77М.б. тупо cmd?

Тупо cmd
Код: vbnet
1.
2.
    If Len(Dir(App.Path & "\logbook.exe")) > 0 Then _
     Shell "cmd /c " & Chr(34) & App.Path & "\logbook.exe" & Chr(34), vbNormalFocus


"решает" проблему,
но при этом cmd тупо висит до закрытия logbook.exe.
Не есть гуд.

А использовать start /w или bat тупо не хочу.
...
Рейтинг: 0 / 0
03.07.2013, 17:33
    #38319287
ZVI
ZVI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать "подвешивание" вызывающего приложения при вызове другого через Shell?
Akinaчё тогда не VBS/JS, скажем?
VBS/J могут быть отключены админом, а BAT не отключают
...
Рейтинг: 0 / 0
03.07.2013, 17:36
    #38319294
ZVI
ZVI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать "подвешивание" вызывающего приложения при вызове другого через Shell?
Дмитрий77А использовать start /w или bat тупо не хочу.
Вместо BAT можно сделать свою легкую EXE , которая быстро отпустит Shell и будет долго грузить logbook.exe
...
Рейтинг: 0 / 0
03.07.2013, 17:45
    #38319320
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать "подвешивание" вызывающего приложения при вызове другого через Shell?
AkinaДмитрий77Shocker.Proили через ShellExecute
Да, уже об этом подумал. Можно попробовать Но ShellExecute это не то же самое что Shell? Небось также ждет результата. Нет?

Да, уже об этом подумал.Т.е. либо одна крайность, либо другая, а вот серединку - ни-ни... ну можно и так .
Уверен что можно?
А то сейчас начну структуры копать а она в итоге все равно ждать будет.
...
Рейтинг: 0 / 0
03.07.2013, 17:46
    #38319322
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать "подвешивание" вызывающего приложения при вызове другого через Shell?
ZVI...cделать свою легкую EXE , которая ...
Вот скажи, сколько этих легких exe можно делать?
Я уже "легкую" dll 3-й день делаю
Что интересно давно сделал, но местному C++ народу все чего-то не нравится.
...
Рейтинг: 0 / 0
03.07.2013, 18:04
    #38319364
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать "подвешивание" вызывающего приложения при вызове другого через Shell?
Дмитрий77Akinaпропущено...
Т.е. либо одна крайность, либо другая, а вот серединку - ни-ни... ну можно и так .
Уверен что можно?
А то сейчас начну структуры копать а она в итоге все равно ждать будет.

М.б.

http://msdn.microsoft.com/en-us/library/windows/desktop/bb762154(v=vs.85).aspx]ShellExecute Ex function

SHELLEXECUTEINFO structure

SEE_MASK_ASYNCOK (0x00100000)

The execution can be performed on a background thread and the call should return immediately without waiting for the background thread to finish. Note that in certain cases ShellExecuteEx ignores this flag and waits for the process to finish before returning.

Похоже на правду?
Вечером попробую.
...
Рейтинг: 0 / 0
03.07.2013, 18:17
    #38319394
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать "подвешивание" вызывающего приложения при вызове другого через Shell?
ZVIVBS/J могут быть отключены админом, а BAT не отключают
Сказать. что удивил ты меня этой фразой - всё равно что ничего не сказать...

Дмитрий77М.б.

http://msdn.microsoft.com/en-us/library/windows/desktop/bb762154(v=vs.85).aspx]ShellExecute Ex function

SHELLEXECUTEINFO structure

SEE_MASK_ASYNCOK (0x00100000)

The execution can be performed on a background thread and the call should return immediately without waiting for the background thread to finish. Note that in certain cases ShellExecuteEx ignores this flag and waits for the process to finish before returning.

Ооо... счас начнём ещё потоки да нити плодить, мутантов всяких - исключительно ради того, чтобы не запустить повторно дочерний процесс...

Кстати, а откель этот logbook.exe, а? не тобою писаный, часом? может, именно его нагрузить заботой не стартовать повторно?
...
Рейтинг: 0 / 0
03.07.2013, 18:52
    #38319449
ZVI
ZVI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать "подвешивание" вызывающего приложения при вызове другого через Shell?
[quot Дмитрий77]ZVIЧто интересно давно сделал, но местному C++ народу все чего-то не нравится.
Просмотрел бегло. Там же возня со связкой C - VB, поэтому "легкости" нет :-)
Правильно было сделано в начале, во 2-м сообщении, с возвратом 2-байтного указателя на начало строки.
Только чтобы не копировать в VB побайтно с помощью накладных вызовов CopyMemory нужно было еще со стороны С возвращать длину строки, например, в модифицируемом со стороны C параметре (int для С и Long для VB).
В VB создать string-переменную, в которую заполнить через String(Длина&,0), а потом одним CopyMemory скопировать текст.
Обычно еще делается txt = StrConv(txt, vbUnicode), если в С строка не в Unicode.

Имя переменной str там не удачное, т.к. такое уже зарезервировано для функции в VB.

А память там освобождать и не нужно было, потому что исходная С-ная строка не модифицируется, а создается копия строки в VB, и возвращаемый указатель там используется только для копирования С-шной строки в другую VB-строку.

Там еще ниже было что-то про пустой возврат строки, не вникал, но такое бывает из-за нулевых байтов в начале строки, помнится, вроде бы такое лечилось Trim-ом в VB.
...
Рейтинг: 0 / 0
03.07.2013, 20:34
    #38319574
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать "подвешивание" вызывающего приложения при вызове другого через Shell?
AkinaОоо... счас начнём ещё потоки да нити плодить, мутантов всяких - исключительно ради того, чтобы не запустить повторно дочерний процесс...?
Akina, речь идет не о повторном запуске logbook.exe.
Код который приведен в начале прекрасно и быстро справляется с НЕзапуском logbook.exe повторно.
Речь идет о том случае когда logbook.exe еще НЕ запущен.
Конкретно о коде
Код: vbnet
1.
Shell App.Path & "\logbook.exe", vbNormalFocus


который возвращает ID нового процесса и из-за этого подвешивает вызывающее приложение до тех пор пока этот ID не получен. Мне этот ID нафик не нужен. Т.е. задача чтобы команда вышла сразу и не ждала.

AkinaКстати, а откель этот logbook.exe, а? не тобою писаный, часом? может, именно его нагрузить заботой не стартовать повторно?
Я отвечу, хотя к вопросу отношения не имеет.

>не тобою писаный, часом?
Часом мной.

>может, именно его нагрузить заботой не стартовать повторно?
Там такой код присутствует:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Sub Main()
  Dim hwndTarget As Long 'hwnd окна PrevInstance
...
  hwndTarget = FindMyWindow(0) 'WINDOWTITLE_LOGBOOK
  If hwndTarget <> 0 Then
    If IsIconic(hwndTarget) Then ShowWindow hwndTarget, SW_RESTORE
    SetForegroundWindow hwndTarget
    Exit Sub
  End If
  'все таки этот вариант надо отработать, т.к. есть шанс быстро щелкнуть 2 раза по иконке(до загрузки формы)
  If App.PrevInstance Then Exit Sub



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

Проблемка не для случая когда запущен а для случая КОГДА ЕЩЕ НЕ ЗАПУЩЕН И НАДО ЗАПУСИТЬ .
...
Рейтинг: 0 / 0
03.07.2013, 21:03
    #38319606
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать "подвешивание" вызывающего приложения при вызове другого через Shell?
ZVIПросмотрел бегло. Там же возня со связкой C - VB, поэтому "легкости" нет :-)
Правильно было сделано в начале, во 2-м сообщении, с возвратом 2-байтного указателя на начало строки.
В реальный проект я ПОКА засунул именно этот вариант, когда ф-ция возвращает char *

ZVIТолько чтобы не копировать в VB побайтно с помощью накладных вызовов CopyMemory нужно было еще со стороны С возвращать длину строки, например, в модифицируемом со стороны C параметре (int для С и Long для VB).
Вот потому что бегло ты не увидел вот этого:
14513805
Где я именно применяю "классический" прием с возвратом длины, копированием строки в буфер и отсеканием \0 через Left$(buf, length).
И по этому варианту я пока жду комментариев, т.к. его можно применять достаточно широко и хорошо бы сразу отработать технику с "запасом прочности".

ZVIОбычно еще делается txt = StrConv(txt, vbUnicode), если в С строка не в Unicode.
Ой-ей. Вот про эту глючную конструкцию только мне не напоминайте. Строка полученная таким образом возвращает потом неправильный len(txt) и я об этом не раз говорил.

ZVIИмя переменной str там не удачное, т.к. такое уже зарезервировано для функции в VB.
По жизни использую str внутри функций, раньше вообще об этом не думал. К проблемам вроде никогда не приводило.


ZVIиз-за нулевых байтов ...помнится, вроде бы такое лечилось Trim-ом в VB.
Ни фига Trim нулевые байты не отсекает.
...
Рейтинг: 0 / 0
03.07.2013, 21:17
    #38319622
ZVI
ZVI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать "подвешивание" вызывающего приложения при вызове другого через Shell?
Дмитрий77Ни фига Trim нулевые байты не отсекает.
Да, вспомнил, там лишний нуль оставался в конце :)
...
Рейтинг: 0 / 0
03.07.2013, 22:58
    #38319709
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать "подвешивание" вызывающего приложения при вызове другого через Shell?
Дмитрий77в данном конкретном случае проще проверить что logbook.exe уже запущен из вызывающего приложения в лоб, не злоупотребляя холостыми запусками
Переварить не удалось - с моей точки зрения это неверный подход. Для меня он аналогичен тому, что ты вместо простого вызова метода объекта или получения свойства объекта начинаешь эмулировать его внешними для этого экземпляра объекта средствами кода, в котором значение свойства или выполнение метода потребовались.

Ну да ладно, просто примем на веру, что так надо.

Следовательно, у тебя просто проблема старта этого приложения через Shell. Посему я бы предложил отбросить все свои предубеждения, закодить все возможные реализации запуска, после чего их сравнить - по коду, по тормозам, по иным параметрам - и выбрать с твоей точки зрения оптимальный.
...
Рейтинг: 0 / 0
03.07.2013, 23:26
    #38319727
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать "подвешивание" вызывающего приложения при вызове другого через Shell?
Короче, я сделал тесты с ShellExecute и ShellExecuteEx
Вот этого:
Дмитрий77ShellExecuteEx

SEE_MASK_ASYNCOK (0x00100000)

The execution can be performed on a background thread and the call should return immediately without waiting for the background thread to finish. Note that in certain cases ShellExecuteEx ignores this flag and waits for the process to finish before returning.
ни фига не надо.
SEE_MASK_DEFAULT достаточно
даже если я хочу заполучить этот несчастный ID запущенного процесса (а я НЕ ХОЧУ)
для чего использую SEE_MASK_NOCLOSEPROCESS + .hProcess

ShellExecuteEx всегда возвращает результат МГНОВЕННО
И даже этого не надо.
Достаточно обычной ShellExecute без всяких Ex

ShellExecute тоже возвращает результат МГНОВЕННО

А вот Shell (который VB6-Production) чего-то ждет и висит до тех пор пока форма не загрузится.


Код: vbnet
1.
2.
3.
4.
5.
6.
Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
 (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, _
 ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

      ShellExecute 0, "open", App.Path & "\logbook.exe", "", App.Path, SW_SHOWNORMAL
     'Shell App.Path & "\logbook.exe", vbNormalFocus



Это ответ. И другого здесь быть не может.
В принципе и Shocker.Pro в 3-м посте об этом сказал, и я сам об этом подумал.
Но я всю жизнь использовал этот
Код: vbnet
1.
Shell (, vbТакойТоБлинФокус)


но никогда не думал что ДО ТАКОВО МАРАЗМА
Думаю хорошая идея проинспектировать все свои коды на предмет ЧИСТКИ от поганца
...
Рейтинг: 0 / 0
04.07.2013, 00:34
    #38319762
ZVI
ZVI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать "подвешивание" вызывающего приложения при вызове другого через Shell?
Дмитрий77Вот потому что бегло ты не увидел вот этого: 14513805
Где я именно применяю "классический" прием с возвратом длины, копированием строки в буфер и отсеканием \0 через Left$(buf, length). И по этому варианту я пока жду комментариев, т.к. его можно применять достаточно широко и хорошо бы сразу отработать технику с "запасом прочности"
То ж другая ветка, мне туда незачем было ходить.
Но ответил там с "более классическим" примером.

В предыдущем сообщении я приврал насчет 2-х байт, 4 конечно.

В общем, со строками в/из DLL не должно быть проблем, если понимать производимые при этом без нашего участия преобразования из BSTR (VB) в т.н. ABSTR (DLL) и обратно.

BSTR представляет из себя массив, в 4-х первых байтах которого записана Long длина сроки в байтах, дальше следуют 2-х байтные (Unicode в терминологии MS) символы.
VarPtr(txt$) указывает на StrPtr(txt$), которая в свою очередь указывает на 5-й байт этого BSTR-массива, т.е. на 1-й байт собственно текстовой части массива.

Перед тем как передать txt в DLL, VB создает временную переменную (массив), в которую кладет суррогат из BSTR.
Этот суррогат неформально называют ASCII BSTR или сокращенно ABSTR.
У него те же 4 байта с прежним значением, а затем идут однобайтные символы, полученные из Unicode 2-байтных, и в конце еще добавляется байтик с нулем.
То есть, длина текстовой части ABSTR в байтах в 2 раза короче текстовой части BSTR плюс 1 нулевой байт в конце.
DLL что-то делает с этим суррогатом и хорошо, если не меняет длину ABSTR, так как первые 4 байта не корректируются.
В обратном порядке txt может быть возвращена из DLL в VB, но StrPtr$(txt) при этом может быть уже другим.
...
Рейтинг: 0 / 0
04.07.2013, 01:36
    #38319800
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убрать "подвешивание" вызывающего приложения при вызове другого через Shell?
ZVI,

Спасибо. К dll еще вернусь.
Но сейчас надо с Shell аккуратно довоевать. Ногами его и ф топку.

На самом деле я погорячился насчет
Дмитрий77 А вот Shell (который VB6-Production) чего-то ждет и висит до тех пор пока форма не загрузится.

Но я всю жизнь использовал этот
Код: vbnet
1.
Shell (, vbТакойТоБлинФокус)


...
Думаю хорошая идея проинспектировать все свои коды на предмет ЧИСТКИ от поганца

Идея может и хорошая, но менять Shell на ShellExecute в существующих кодах надо аккуратно.
Где-то надо (как в случае приведенном в первом посте).
Где-то не имеет смысла (например при командах типа Shell ("explorer" ...), либо когда известно что запускаемое приложение быстрое и скорость запуска не зависит от к-ва данных и т.п.)

А вот в одном месте я просто с разбегу накололся:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Sub Main()
    ...
    ' предполагая что FormMain будет грузиться долго запускаем заставку для ублажения юзера
    Shell App.Path & "\screen.exe", vbNormalFocus
    FormMain.Show

'код загрузки FormMain
Private Sub Form_Load()
  'В самом начале и без проверок!!!
  Dim hwndScreen As Long
  hwndScreen = FindMyWindow(3) 'WINDOWTITLE_SCREENSAVER
...Do-do-do
  SendCommandToScreen hwndScreen, 5 ' отображение загрузки через ProgressBar на заставке
...Do-do-do
  SendCommandToScreen hwndScreen, 50 ' отображение загрузки через ProgressBar на заставке
...Do-do-do
  SendCommandToScreen hwndScreen, 100 ' отображение загрузки через ProgressBar на заставке



Фишка в чем.
hwndScreen -'это окно заставки
И доступно оно будет (<> 0) только когда форма заставки загрузится (в приложении screen.exe)
Когда я эту фигню делал, меня занимал вопрос:
А вдруг я не смогу поймать hwndScreen = FindMyWindow(3) ?
Ведь я только запустил screen.exe и окно могло НЕ УСПЕТЬ запуститься.
И честно готовился чего-нибудь дописывать.
В итоге все оказалось OK. Я об этом забыл.

А в рамках начатой было компании по борьбе с Shell которую я было развернул, сделав замену

Код: vbnet
1.
2.
'Shell App.Path & "\screen.exe", vbNormalFocus
ShellExecute 0, "open", App.Path & "\screen.exe", "", App.Path, SW_SHOWNORMAL


я получил мгновенный выход
и незапуск нужного мне окна hwndScreen
на момент FindMyWindow(3)
как итог полный сбой алгоритма

Т.е. я неявно использовал свойство Shell (VB6) не выходить до загрузки формы.
Ну, все хорошо в своем месте в свое время. А понимание никогда не повредит.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как убрать "подвешивание" вызывающего приложения при вызове другого через Shell? / 24 сообщений из 24, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]