Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
 Аватар для Rh2Dark
32 / 32 / 0
Регистрация: 05.11.2020
Сообщений: 102

Как получить значение аргументов командной строки указанного процесса?

06.11.2020, 18:11. Показов 1701. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В чем суть вопроса: написал свою прогу-СТАРТЕР, которая готовит нужные данные и запускает другую прогу (назову её ГЛАВНАЯ ПРОГА, но их может быть несколько, с разными параметрами и разными базами данных). И вот пользователи как-то умудряются запускать несколько экземпляров СТАРТЕРА сразу (то ли мышь дребезжит контактами, то ли задержка между клиентским рабочим местом и сервером влияет). Необходимо проге-СТАРТЕРУ запустившись, определить, а не идет ли уже запуск именно этой ГЛАВНОЙ ПРОГИ. Чтобы определить какую именно ГЛАВНУЮ ПРОГУ запускать, СТАРТЕР сам запускается с ключами-параметрами командной строки. Допустим, старт дубля я определю через App.Previnstance, пробегусь по процессам, найду ранее запущенные процессы СТАРТЕРА, но для полной идентификации дубля мне нужно знать ещё и параметры командной строки, с которыми были запущены другие СТАРТЕРЫ. Как же получить параметры командной строки других процессов? Второй день насилую интернет в поисках ответа, получаю намеки на библиотеку kernel32.dll или даже на ntdll.dll, но все описания документов на других языках типа "C++" и при этом весьма туманны. Мне бы пример, как выдернуть эту командную строку, зная процесс.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.11.2020, 18:11
Ответы с готовыми решениями:

Сколько аргументов командной строки при запуске bash-скрипта позволяют получить предопределенные переменные $#, $1,.,$
Сколько аргументов командной строки при запуске bash-скрипта позволяют получить предопределенные переменные $#, $1,...,$9

Получить список модулей указанного процесса
Доброго времени суток. Возникла проблема с получением списка модулей процесса. Пытаюсь получить так: BOOL ListProcessModules(DWORD...

Использование аргументов командной строки
Всем доброго дня !!! Подскажите пожалуйста как связать этот код программы с командной строкой ? #include <fstream> ...

17
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
06.11.2020, 19:57
Rh2Dark, вообще неправильно организовано все. Нужно при старте создавать глобальный объект ядра и все. Другие копии попытаются создать его и получать ошибку ERROR_ALREADY_EXISTS.

Цитата Сообщение от Rh2Dark Посмотреть сообщение
Второй день насилую интернет в поисках ответа
Visual Basic
1
2
3
4
5
6
7
8
9
Dim objWMIService, objProcess, colProcess
 
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
 
Set colProcess = objWMIService.ExecQuery("Select * from Win32_Process")
 
For Each objProcess In colProcess
    Debug.Print objProcess.Name & " | " & objProcess.CommandLine
Next
2
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
06.11.2020, 20:06
Цитата Сообщение от Rh2Dark Посмотреть сообщение
Мне бы пример, как выдернуть эту командную строку, зная процесс.
Знать процесс мало.
Вам надо загрузить параметры процесса в структуру RTL_USER_PROCESS_PARAMETERS, адрес которой определен в структуре PEB параметром ProcessParameters. Именно в ней записана нужная информация - путь к исполняемому файлу процесса и его командная строка. И всё это из ReadProcessMemory.
К сожалению на VB6 нет у меня исходника. Но вот тут описано всё достаточно информативно, с нужными структурами и API для этого
1
 Аватар для Rh2Dark
32 / 32 / 0
Регистрация: 05.11.2020
Сообщений: 102
07.11.2020, 12:17  [ТС]
The trick, благодарю за ответ, но использовать WMI нежелательно (особенности корпоративной политики, да и надежность падает). Про глобальный объект ядра не поясните чуть подробнее? Если это приведет к тому, что сможет запуститься лишь один экземпляр проги, то это не подходит.

Добавлено через 25 минут
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Вам надо загрузить параметры процесса в структуру RTL_USER_PROCESS_PARAMETERS, адрес которой определен в структуре PEB параметром ProcessParameters. Именно в ней записана нужная информация - путь к исполняемому файлу процесса и его командная строка. И всё это из ReadProcessMemory.
К сожалению на VB6 нет у меня исходника. Но вот тут описано всё достаточно информативно, с нужными структурами и API для этого
Pro_grammer, о да, Ассемблер - наше всё! Серьезно, я очень уважаю этот язык, сам когда-то баловался им на ZX-Spectrum, но для PC... для меня прошло столько лет, и здесь всё другое
Я встречал в своих поисках описания структур RTL_USER_PROCESS_PARAMETERS и PEB на MSDN, только если бы хорошо знал СИшный глагол, да как работать с API в Visual Basic, давно бы сам допетрил. С API на VB я дружу не очень, больше полагаюсь на примеры. Благодарю что ответили, по крайней мере это доказывает что я на правильном пути. Буду дальше пилить гири и надеяться что попадется то что я смогу использовать или ответят здесь (последнее уже маловероятно, т.к. гуру сказали своё веское слово).
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
07.11.2020, 15:42
Лучший ответ Сообщение было отмечено Rh2Dark как решение

Решение

Цитата Сообщение от Rh2Dark Посмотреть сообщение
ро глобальный объект ядра не поясните чуть подробнее? Если это приведет к тому, что сможет запуститься лишь один экземпляр проги, то это не подходит.
Нет. Дело в том что создание объекта ядра атомарно, т.е. не может произойти случая когда два приложения создадут два разных объекта с одинаковым именем. Вот и исходи из этой логики. Если у тебя "главные" приложения принимают командную строку с путем к БД, то можно к примеру вычислять хеш этого пути и пытаться создавать объект к примеру "MyObject" & Str(Hash). Приложения с разными командными строками могут быть запущены, а с одинаковыми - нет. Ну это пример.

Цитата Сообщение от Rh2Dark Посмотреть сообщение
Я встречал в своих поисках описания структур RTL_USER_PROCESS_PARAMETERS и PEB на MSDN, только если бы хорошо знал СИшный глагол, да как работать с API в Visual Basic, давно бы сам допетрил. С API на VB я дружу не очень, больше полагаюсь на примеры. Благодарю что ответили, по крайней мере это доказывает что я на правильном пути. Буду дальше пилить гири и надеяться что попадется то что я смогу использовать или ответят здесь (последнее уже маловероятно, т.к. гуру сказали своё веское слово).
Это очень подозрительно для антивирусов, но если все равно то уже есть готовый код для этого https://www.cyberforum.ru/post5461583.html
1
16 / 15 / 1
Регистрация: 15.08.2020
Сообщений: 96
07.11.2020, 16:29
Цитата Сообщение от Rh2Dark Посмотреть сообщение
пользователи как-то умудряются запускать несколько экземпляров СТАРТЕРА сразу (то ли мышь дребезжит контактами, то ли задержка между клиентским рабочим местом и сервером влияет). Необходимо проге-СТАРТЕРУ запустившись, определить, а не идет ли уже запуск именно этой ГЛАВНОЙ ПРОГИ. Чтобы определить какую именно ГЛАВНУЮ ПРОГУ запускать, СТАРТЕР сам запускается с ключами-параметрами командной строки. Допустим, старт дубля я определю через App.Previnstance, пробегусь по процессам, найду ранее запущенные процессы СТАРТЕРА, но для полной идентификации дубля мне нужно знать ещё и параметры командной строки, с которыми были запущены другие СТАРТЕРЫ. Как же получить параметры командной строки других процессов? Второй день насилую интернет в поисках ответа, получаю намеки на библиотеку kernel32.dll или даже на ntdll.dll, но все описания документов на других языках типа "C++" и при этом весьма туманны. Мне бы пример, как выдернуть эту командную строку, зная процесс.
Вариант.
При запуске программа, любая, пишет в текстовый файл себя и свои параметры запуска, пользователя, время запуска, время выгрузки.
Может быть и параметры своего процесса (наверное, это возможно, но не пробовал. Просто, идея) для последующего поиска в процессах.
Другая программа считывает эти данные, обрабатывает и делает выводы.
Если необходимо, текстовые файлы создаются в папке с доступом пользователям "только запись".

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

В общем, если по другому не получится, можно попробовать этот вариант.
Он может быть и проще и нагляднее.
Всегда можно и с самому прочитать, что "о себе пишут программы", кем и кода запущены...
0
sleep
 Аватар для I can
4931 / 4591 / 840
Регистрация: 13.04.2015
Сообщений: 9,743
07.11.2020, 16:30
Цитата Сообщение от Rh2Dark Посмотреть сообщение
умудряются запускать несколько экземпляров СТАРТЕРА
Сделать, чтобы только один экземпляр стартера запускался - не вариант?
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
07.11.2020, 17:49
Цитата Сообщение от brigval Посмотреть сообщение
При запуске программа, любая, пишет в текстовый файл себя и свои параметры запуска, пользователя, время запуска, время выгрузки.
Может быть и параметры своего процесса (наверное, это возможно, но не пробовал. Просто, идея) для последующего поиска в процессах.
Другая программа считывает эти данные, обрабатывает и делает выводы.
Если необходимо, текстовые файлы создаются в папке с доступом пользователям "только запись".
Не пойдет. У него могут быть запущены 2 копии с разными параметрами и вторая копия не должна закрываться.

Добавлено через 1 минуту
Цитата Сообщение от I can Посмотреть сообщение
Сделать, чтобы только один экземпляр стартера запускался - не вариант?
Зачем? Вот у тебя есть приложение которое работает с какой либо БД. В параметрах ты передаешь путь к БД. Нужно мне с 2-мя разными базами работать - я запускаю 2 копии приложения.
0
sleep
 Аватар для I can
4931 / 4591 / 840
Регистрация: 13.04.2015
Сообщений: 9,743
07.11.2020, 17:53
Цитата Сообщение от The trick Посмотреть сообщение
Нужно мне с 2-мя разными базами работать - я запускаю 2 копии приложения.
Я про программу-стартер. ТС описал, что проблема в том, что несколько экземпляров запускаются случайно:
Цитата Сообщение от Rh2Dark Посмотреть сообщение
то ли мышь дребезжит контактами, то ли задержка
А уже из стартера запускаются программы для работы с базами
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
07.11.2020, 17:56
Цитата Сообщение от I can Посмотреть сообщение
Я про программу-стартер. ТС описал, что проблема в том, что несколько экземпляров запускаются случайно
Насколько я понял это не так:
Цитата Сообщение от Rh2Dark Посмотреть сообщение
Если это приведет к тому, что сможет запуститься лишь один экземпляр проги, то это не подходит
0
16 / 15 / 1
Регистрация: 15.08.2020
Сообщений: 96
07.11.2020, 20:08
Цитата Сообщение от The trick Посмотреть сообщение
Не пойдет. У него могут быть запущены 2 копии с разными параметрами и вторая копия не должна закрываться.
Если будут запущены две копии с разными параметрами, значит в текстовом файле появятся две новые строки со всеми необходимыми для анализа данными.
Хотя, может, и недопонял задачу.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
07.11.2020, 21:28
Цитата Сообщение от brigval Посмотреть сообщение
Если будут запущены две копии с разными параметрами, значит в текстовом файле появятся две новые строки со всеми необходимыми для анализа данными.
Две программы одновременно начинают писать в файл - что будет?
1
 Аватар для Rh2Dark
32 / 32 / 0
Регистрация: 05.11.2020
Сообщений: 102
07.11.2020, 22:21  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Это очень подозрительно для антивирусов, но если все равно то уже есть готовый код для этого https://www.cyberforum.ru/post5461583.html
Вооот! Это уже похоже на правду! А я ведь и на этом форуме тоже поиском всё перерыл! Но меня постоянно отсылало то к СИшникам, то Питонщикам... Всё, пойду копаться в коде, экспериментировать...
The trick, моё почтение!!!
0
 Аватар для Rh2Dark
32 / 32 / 0
Регистрация: 05.11.2020
Сообщений: 102
07.11.2020, 23:17  [ТС]
Вот она, родная!
0
16 / 15 / 1
Регистрация: 15.08.2020
Сообщений: 96
08.11.2020, 10:18
Цитата Сообщение от The trick Посмотреть сообщение
Две программы одновременно начинают писать в файл - что будет?
Вопрос больше, теоретический.
Наверное, одной или обеим будет отказано в доступе. Для этого случая, можно организовать проверку записи...
Но чтобы, две программы запустились абсолютно одновременно, а тем более от одного пользователя, моловероятно.
Для человека и дребезг мыши может быть одновременным, а для процессов записи-чтения это может быть "космосом".
ЯТД.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
08.11.2020, 11:05
Цитата Сообщение от brigval Посмотреть сообщение
Наверное, одной или обеим будет отказано в доступе.
Почему? Если файлы открыты на запись без блокировки то оба будут писать одновременно и будет каша. Какое поведение от программы ожидается в этом случае?
Я пишу это для того что в любом случае нужно разделять запись через мьютекс какой-нибудь. Но раз мы используем мьютекс (или вообще любой объект синхронизации) то и запись в файл тогда не нужна, т.к. можно синхронизировать через мьютекс работу.

Добавлено через 30 минут
Цитата Сообщение от Rh2Dark Посмотреть сообщение
Вот она, родная!
Так нельзя. Теоретически может случится так что пока ты проверяешь командную строку, запустится другой процесс. Нужно делать синхронизацию.
0
 Аватар для Rh2Dark
32 / 32 / 0
Регистрация: 05.11.2020
Сообщений: 102
08.11.2020, 20:37  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Так нельзя. Теоретически может случится так что пока ты проверяешь командную строку, запустится другой процесс. Нужно делать синхронизацию.
Вот здесь не понял, что именно нельзя? На скриншоте всего лишь тестовая прога для получения командной строки процессов.
И кстати, в попытках проанализировать код получения командной строки вдруг посетили меня сомнения - там есть три выхода из функции, а хэндл процесса закрывать разве не надо?

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Function GetCmdLineFromPID(PID As Long) As String
Dim hProcess As Long
Dim pbi As PROCESS_BASIC_INFORMATION
Dim lpPP As Long                'Oeacaoaeu ia ia?aiao?u i?ioanna
Dim cmd As UNICODE_STRING       'No?oeoo?a aey o?aiaiey ?ieeiaiie no?iee
'*********************************************
'Iieo?aai oaiae
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, False, PID)
If hProcess Then
   'Iieo?aai oeacaoaeu ia PEB
   If NtQueryInformationProcess(hProcess, 0, pbi, Len(pbi), ByVal 0) Then Exit Function
   'Iieo?aai oeacaoaeu ia ia?aiao?u i?ioanna
   If ReadProcessMemory(hProcess, ByVal pbi.PebBaseAddress + &H10, lpPP, 4, 0) = 0 Then GoTo ExitFunction ' Выход из функции! А хэндл процесса закрывать разве не надо?
   'Iieo?aai no?oeoo?o UNICODE_STRING niaa??auo? eiiiaiaio? no?ieo
   If ReadProcessMemory(hProcess, ByVal lpPP + &H40, cmd, Len(cmd), 0) = 0 Then GoTo ExitFunction ' Выход из функции! А хэндл процесса закрывать разве не надо?
   '?eoaai no?ieo
   GetCmdLineFromPID = Space(cmd.Length \ 2) 'Auaaeyai aooa? ainoaoi?iie aeeiu
   If ReadProcessMemory(hProcess, ByVal cmd.lpBuffer, ByVal StrPtr(GetCmdLineFromPID), cmd.Length, 0) = 0 Then GoTo ExitFunction ' Выход из функции! А хэндл процесса закрывать разве не надо?
   CloseHandle hProcess ' И только здесь закрытие хэндла процесса!
End If
End Function
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
15.11.2020, 21:54
Цитата Сообщение от Rh2Dark Посмотреть сообщение
Вот здесь не понял, что именно нельзя?
Так делать - проверять командную строку процессов, т.к. пока ты проверяешь может случится так что откроется другой процесс и его строку ты уже не проанализируешь.

Цитата Сообщение от Rh2Dark Посмотреть сообщение
И кстати, в попытках проанализировать код получения командной строки вдруг посетили меня сомнения - там есть три выхода из функции, а хэндл процесса закрывать разве не надо?
Нужно. В коде нужно вставить CloseHandle.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.11.2020, 21:54
Помогаю со студенческими работами здесь

Проверка аргументов командной строки
Код вызывающий программу (интерфейс для работы с разными программами): { int caesar = ui.key->value(); char *_fileWay =...

Реализация аргументов командной строки
Существуют ли какие-либо стандартные приемы реализации обработки аргументов командной строки К примеру требуется обработать команду...

Разбор аргументов командной строки
Для Unix существуют специальные средства для разбора опций командной строки (функции GNU getopt и getopt_long). Хотелось бы узнать, есть ли...

Разбор аргументов командной строки
#!/usr/bin/python3.4 # -*- coding: UTF-8 -*- import sys import argparse import os import re def createParser (): ...

Передача аргументов командной строки
Здравствуйте. Подскажите пожалуйста, зачем в этом коде "return 1;"? #include <iostream> #include <cstdlib> using namespace std;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru