Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 21.06.2019
Сообщений: 76

Считывание аргументов командной строки

10.01.2022, 01:29. Показов 1444. Ответов 20
Метки c#, c++ (Все метки)

Студворк — интернет-сервис помощи студентам
Возникла проблема при считывании аргументов командной строки на плюсах, задача следующая у меня есть мое приложение которое принимает аргументы от чужого приложения и проблема состоит в следующем.
Мое c++ приложение почему-то не правильно считывает аргументы с которыми запускается от чужого приложения при том, что
на c#(net.framework) все работает нормально.
Я должен получить аргументы -User и -pass
C++ считывает их в таком виде -User %user% -pass %password% через int argc, char* argv[]
А C# на фреймворке получает их в нормальном виде -User admin -pass qwe1234 через string[] args
Я не могу понять в чем проблема, кто-нибудь имеет какие-нибудь идеи ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.01.2022, 01:29
Ответы с готовыми решениями:

Обработка аргументов командной строки
Не нашел где создать тему, поэтому решил здесь. 1. Интересуют стандарты для аргументов командной строки, то есть как обычно их...

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

Ввод аргументов командной строки
Здравствуйте, такой вопрос: как задаются аргументы командной строки в си? нужно скомпилировать exe и запустить его через командную строку...

20
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
10.01.2022, 01:47
Цитата Сообщение от zanai Посмотреть сообщение
C++ считывает их в таком виде -User %user% -pass %password% через int argc, char* argv[]
Это и есть именно то, что вам передало чужое приложение.

Цитата Сообщение от zanai Посмотреть сообщение
Я не могу понять в чем проблема, кто-нибудь имеет какие-нибудь идеи ?
Ну видимо в том, что С++ и C# - это разные фреймворки, которые ведут себя по-разному.
0
0 / 0 / 0
Регистрация: 21.06.2019
Сообщений: 76
10.01.2022, 01:58  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это и есть именно то, что вам передало чужое приложение.
Как раз нет, если я посмотрю в процесс хакере command line, передается оно так -User %user% -pass %password%, но считывают эти аргументы программы по разному. На шарпе читается она как надо, т.е. -User admin -pass qwe1234, а на плюсах читается -User %user% -pass %password%, как я могу считать на плюсах эти аргументы как на шарпе, что бы передалось все правильно?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
10.01.2022, 02:16
Цитата Сообщение от zanai Посмотреть сообщение
Как раз нет, если я посмотрю в процесс хакере command line, передается оно так -User %user% -pass %password%,
Не понял. Я же вам ясно сказал: это и есть именно то, что передает вам чужое приложение. Вы в этом убедились в процесс хакере.

О каком "как раз нет" вы тогда ведете речь?

Цитата Сообщение от zanai Посмотреть сообщение
но считывают эти аргументы программы по разному.
Совершенно верно, считывают по-разному. Точнее, считывают-то одинаково, но потом С# делает дополнительную обработку и замену %% переменных.

Цитата Сообщение от zanai Посмотреть сообщение
как я могу считать на плюсах эти аргументы как на шарпе, что бы передалось все правильно?
Никак. Считывается все везде одинаково и везде правильно. Но, еще раз, потом С# делает дополнительную обработку и замену %% переменных.

В С++ эту дополнительную обработку вам придется делать самостоятельно. Не хотите делать ручками - ищите готовое решение для С++.
0
0 / 0 / 0
Регистрация: 21.06.2019
Сообщений: 76
10.01.2022, 04:36  [ТС]
А где мне найти эту дополнительную обработку и как она вообще производится в c#, что бы я смог её сделать для C++ ?
0
Эксперт .NET
 Аватар для Rius
13131 / 7691 / 1677
Регистрация: 25.05.2015
Сообщений: 23,468
Записей в блоге: 14
10.01.2022, 08:52
Цитата Сообщение от zanai Посмотреть сообщение
как она вообще производится в c#
https://docs.microsoft.com/ru-... ew=net-6.0
Цитата Сообщение от zanai Посмотреть сообщение
что бы я смог её сделать для C++
https://docs.microsoft.com/en-... ntstringsa
https://docs.microsoft.com/en-... gsforusera
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
10.01.2022, 08:59
Цитата Сообщение от zanai Посмотреть сообщение
А где мне найти эту дополнительную обработку и как она вообще производится в c#
Код на C# можно декомпилировать и получить код очень близкий к оригиналу.
0
0 / 0 / 0
Регистрация: 21.06.2019
Сообщений: 76
10.01.2022, 19:55  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Сообщение от zanai
как она вообще производится в c#
https://docs.microsoft.com/ru-... ew=net-6.0
Сообщение от zanai
что бы я смог её сделать для C++
https://docs.microsoft.com/en-... ntstringsa
https://docs.microsoft.com/en-... gsforusera
ExpandEnvironmentStringsA по прежнему возращает %user% и %password%, имеете ли какие-нибудь идеи почему так ?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
10.01.2022, 20:01
Цитата Сообщение от zanai Посмотреть сообщение
ExpandEnvironmentStringsA по прежнему возращает %user% и %password%, имеете ли какие-нибудь идеи почему так ?
А где ваш код? Как вы используете ExpandEnvironmentStringsA?
0
0 / 0 / 0
Регистрация: 21.06.2019
Сообщений: 76
10.01.2022, 20:29  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Сообщение от zanai
ExpandEnvironmentStringsA по прежнему возращает %user% и %password%, имеете ли какие-нибудь идеи почему так ?
А где ваш код? Как вы используете ExpandEnvironmentStringsA?
CHAR tttt[MAX_PATH];
ExpandEnvironmentStringsA("%user%", tttt, MAX_PATH - 1); пробовал так
и так пробовал ExpandEnvironmentStringsA(fullarg, ModulePath, MAX_PATH - 1); fullarg типа char и содержит полную строку аргументов
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
10.01.2022, 20:41
Цитата Сообщение от zanai Посмотреть сообщение
CHAR tttt[MAX_PATH];
ExpandEnvironmentStringsA("%user%", tttt, MAX_PATH - 1); пробовал так
У меня все работает, если я использую существующую переменную окружения. Но в обычном окружении Windows нет никакого %user% и уж тем более нет никакого %password%. Так что откуда ваш C# берет эти переменные - отдельный вопрос.

У вас часом в окружение не добавлены вручную такие переменные? Вы запускаете это на той же машине, где и запускали C# программу?
0
0 / 0 / 0
Регистрация: 21.06.2019
Сообщений: 76
10.01.2022, 21:17  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
У меня все работает, если я использую существующую переменную окружения. Но в обычном окружении Windows нет никакого %user% и уж тем более нет никакого %password%. Так что откуда ваш C# берет эти переменные - отдельный вопрос.
У вас часом в окружение не добавлены вручную такие переменные? Вы запускаете это на той же машине, где и запускали C# программу?
Мне неизвестно где хранятся эти переменные и как они создаются, как я и сказал, мою программу запускает сторонняя программа с этими аргументами, C# как-то получается то, что хранится под %user% при считывании, возможно в окружение эти переменные добавляются программой которая запускает мою программу, но как мне их так же считать на c++ ? Так-как c# не дает мне реализовать конкретные функции моей программы.
0
Эксперт .NET
 Аватар для Rius
13131 / 7691 / 1677
Регистрация: 25.05.2015
Сообщений: 23,468
Записей в блоге: 14
10.01.2022, 21:22
Цитата Сообщение от zanai Посмотреть сообщение
имеете ли какие-нибудь идеи почему так
Там 2 функции приведены. Вы обе пробовали?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
10.01.2022, 21:31
Цитата Сообщение от zanai Посмотреть сообщение
Мне неизвестно где хранятся эти переменные и как они создаются
Ну так выполните set в командной строке Windows. Есть в полученном списке такие переменные?
0
0 / 0 / 0
Регистрация: 21.06.2019
Сообщений: 76
10.01.2022, 21:49  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Там 2 функции приведены. Вы обе пробовали?
Да.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Ну так выполните set в командной строке Windows. Есть в полученном списке такие переменные?
Их там нету.
0
Эксперт .NET
 Аватар для Rius
13131 / 7691 / 1677
Регистрация: 25.05.2015
Сообщений: 23,468
Записей в блоге: 14
10.01.2022, 22:13
Какой код возвращает ExpandEnvironmentStringsA?
Подсуньте такой код чужой программе:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
 
int main(int argc, char* argv[])
{
    cout << "You have entered " << argc
        << " arguments:" << "\n";
 
    for (int i = 0; i < argc; ++i)
        cout << argv[i] << "\n";
    int a;
    cin >> a;
}
Windows Batch file
1
2
3
4
5
6
7
8
9
10
set _user="user1"
set _pass="pass2"
 
ConsoleApplication1.exe -User %_user% -Pass %_pass%
You have entered 5 arguments:
ConsoleApplication1.exe
-User
user1
-Pass
pass2
На 12 строке программа приостанавливается и в ProcessExplorer можно увидеть, что у exe командная строка была: ConsoleApplication1.exe -User "user1" -Pass "pass2"
0
0 / 0 / 0
Регистрация: 21.06.2019
Сообщений: 76
10.01.2022, 22:31  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Какой код возвращает ExpandEnvironmentStringsA?
Какой код возращает я не смотрел
Цитата Сообщение от Rius Посмотреть сообщение
Подсуньте такой код чужой программе:
Т.е. изменить код моей программы на этот ?
0
Эксперт .NET
 Аватар для Rius
13131 / 7691 / 1677
Регистрация: 25.05.2015
Сообщений: 23,468
Записей в блоге: 14
10.01.2022, 22:36
Можно собрать новый exe и его подсунуть вызывающей программе. Прям заменять исходники у вас - не обязательно.
0
0 / 0 / 0
Регистрация: 21.06.2019
Сообщений: 76
10.01.2022, 22:53  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Можно собрать новый exe и его подсунуть вызывающей программе. Прям заменять исходники у вас - не обязательно.
Так оно выводит правильно используя ваш батник
Цитата Сообщение от Rius Посмотреть сообщение
set _user="user1"
set _pass="pass2"
ConsoleApplication1.exe -User %_user% -Pass %_pass%
Code
1
2
[+]Getting arguments
-User user1 -Pass pass2
Но при запуске с программы той, все так же %user% и %password%, тогда я щас еще больше запутался... И в process explorer отображается именно %user% и %password% при запуске от той программы

Добавлено через 6 минут
При запуске с
Цитата Сообщение от zanai Посмотреть сообщение
set _user="user1"
set _pass="pass2"
ConsoleApplication1.exe -User %_user% -Pass %_pass%
-User "user1" -Pass "pass2" в process explorer выглядит так
0
Эксперт .NET
 Аватар для Rius
13131 / 7691 / 1677
Регистрация: 25.05.2015
Сообщений: 23,468
Записей в блоге: 14
10.01.2022, 23:53
Можно использовать C# программу как промежуточную, для запуска сишной с распознанными аргументами.
Можно поискать в коде вызывающей программы, каким именно образом она производит вызов. Возможно, дизассемблером, отладчиком.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.01.2022, 23:53
Помогаю со студенческими работами здесь

Вывод аргументов командной строки
Доброго времени. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; int _tmain(int argc, _TCHAR*...

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

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

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

Передача аргументов командной строки функции main()
Добрый день Дана задача: Напишите программу, которая запрашивает пароль, задаваемый в команд- ной строке. Ваша программа не должна...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru