Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020

Как сплести набор взаимосвязанных утилит ?

20.07.2015, 09:42. Показов 3877. Ответов 51
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Пишу набор утилит, создал несколько проектов в одном решении в VS. Утилиты при выполнении операций будут взаимодействовать друг с другом. Пока что для запуска намерен использовать одну из функций ShellExecute() или CreateProcess() или system("*.exe").
Вопрос: существует ли ещё какие либо решения взаимовызова для подобных комплексов?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.07.2015, 09:42
Ответы с готовыми решениями:

Набор утилит из Steam-версии Civilization V
Уважаемые форумчане, есть ли у кого-нибудь лицензионная цивилизация, активированная через стим?

Как посчитать значения взаимосвязанных колонок?
Здравствуйте, не уверен, что правильно выбрал раздел, ну да и чёрт с ним, разберемся по ходу. В общем есть две таблицы, одна Авторы,...

Как заменить набор символов на другой набор
В Perl есть оператор tr//, который меняет одни символы на другие. Например: $code =~ tr/eopaxcm/еорахсм/; при этом латинская...

51
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
23.07.2015, 09:04
Лучший ответ Сообщение было отмечено VoltDeMar как решение

Решение

Студворк — интернет-сервис помощи студентам
У меня этот код не падает и не срабатывают никакие DEBUG-ассерты.
1
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
23.07.2015, 10:29  [ТС]
Переписал вызываемую программу так. Ошибки теперь не возникает.
Но, при запуске напрямую вывод в консоль аргументов не происходит, а при запуске через CreateProcess все нормально выводится. В чем соль?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int wmain(int argc, wchar_t *argv[])
{
    for ( int i = 0; i < sizeof argv ; i++)
    if (argv[i] != NULL)
    {
        std:: wstring s = argv[i];
        std::wcout << s.c_str()  << std::endl;
    }
 
    int i = CopyFile(argv[1], argv[2], false);
    std::cout << i << std::endl;
    system("pause");
    if (i != 0)
        return 0;
    else
        return 1;
}
Добавлено через 53 секунды
Цитата Сообщение от Убежденный Посмотреть сообщение
У меня этот код не падает и не срабатывают никакие DEBUG-ассерты.
Может особенности настройки ОС или среды?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.07.2015, 13:43
Цитата Сообщение от VoltDeMar Посмотреть сообщение
Но, при запуске напрямую вывод в консоль аргументов не происходит, а при запуске через CreateProcess все нормально выводится. В чем соль?
вероятно, проект не консольный.
а это значит, что по дефолту ввод-вывод процесса не будет связан ни с какой консолью
а это значит, что не будет никакого чернобелого окошка,
а весь выхлоп от std::cout улетит вникуда.

что бы поиметь консольку для вин32приложения,
необходимо приаттачить её к процессу,
и перенастроить весь ввод-вывод на эту консоль.

делается это при мерно так:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <windows.h>
#include <fcntl.h>
#include <io.h>
 
 
    void RedirectIOToConsole();
 
    // --- заполучаем консоль с воё пользование
    void AttachConsole()
    {
        const auto success = ::AllocConsole();
        ASSERT(success);
        RedirectIOToConsole();
        setlocale(LC_ALL,"");
    }
 
    // --- перенаправление стандартных потоков 
    // в новый консольный буффер
    void RedirectIOToConsole()
    {
        int  hConHandle; 
        long lStdHandle; 
        FILE* fp;
 
        // redirect unbuffered STDOUT to the console
        lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE); 
        hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
        fp = _fdopen( hConHandle, "w" ); 
        *stdout = *fp; 
        setvbuf( stdout, NULL, _IONBF, 0 );
 
        // redirect unbuffered STDIN to the console
        lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE); 
        hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
        fp = _fdopen( hConHandle, "r" ); 
        *stdin = *fp; 
        setvbuf( stdin, NULL, _IONBF, 0 );
 
        // redirect unbuffered STDERR to the console
        lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE); 
        hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
        fp = _fdopen( hConHandle, "w" ); 
        *stderr = *fp; 
        setvbuf( stderr, NULL, _IONBF, 0 );
    
        // перенастройка приплюснутых потоков
        // сишные потоки синхронизируются с приплюснутыми
        std::ios::sync_with_stdio(); 
    }




при запуске в качестве дочернего,
вероятно ваш ребенок унаследовал дискрипторы консольного родителя.
1
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.07.2015, 13:45
VoltDeMar, Вы бы в MSDN заглянули https://msdn.microsoft.com/en-... 85%29.aspx и посмотрели что каждый параметры значит. Ну а если слабо переводить в книгу Рихтера.
1
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
23.07.2015, 13:45  [ТС]
Текущий код вызываемой программы:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int wmain(int argc, wchar_t *argv[])
{
    for ( int i = 0; i < sizeof argv ; i++)
    if (argv[i] != NULL)
    {       std:: wstring s = argv[i];
        std::string d(s.begin(), s.end());
        std::cout << d.c_str() << std::endl;    }
 
    std::cout << "Step 1" << std::endl;
    int i = CopyFile(argv[1], argv[2], false);
    std::cout << "Step 2" << std::endl;
    std::cout << i << std::endl;
    std::cout << "Step 3" << std::endl;
    system("pause");
    if (i != 0) // функция возвращает не 0 если успешно завершается.
        return 0;
    else    
        return 1;}
Текущий код вызывающей программы:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int wmain(int argc, wchar_t *argv[])
{
    std::wstring directory;
    std::wstring path = argv[0];
    const size_t last_slash_idx = path.rfind('\\');
    if (std::string::npos != last_slash_idx)
    {       directory = path.substr(0, last_slash_idx); }
    directory += L"\\CopyFile.exe";
    STARTUPINFO cif;
    ZeroMemory(&cif,sizeof(STARTUPINFO));
    PROCESS_INFORMATION pi; 
    SECURITY_ATTRIBUTES sa;
    WCHAR cmd[128];
    lstrcpy(cmd,L"C:\\SourceDirectory\\2.txt C:\\DestDirectory\\2.txt");
    std::cout << "Процесса создание: " << CreateProcess(directory.c_str(), cmd, NULL, NULL, true, HIGH_PRIORITY_CLASS, NULL, NULL, &cif, &pi ) << std::endl;    
    return 0;
Вот такая ошибка теперь возникает (ни один из Step-ов не выполняется) :
Миниатюры
Как сплести набор взаимосвязанных утилит ?  
0
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
23.07.2015, 13:47  [ТС]
Может дело в правах доступа или других элементах взаимодоступа приложений в Windows, как это выяснить?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
23.07.2015, 13:51
Так в каком месте падает ?
Какой код исключения ?
Стек падения можно глянуть ?

А так ведь можно до осени гадать...

И покажите командную строку, с которой запускается программа.
1
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
23.07.2015, 14:04  [ТС]
Таже ошибка если запустить отдельно (и от админа и просто).
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
23.07.2015, 14:07
Цитата Сообщение от VoltDeMar Посмотреть сообщение
for ( int i = 0; i < sizeof argv ; i++)
Здесь "sizeof argv" всегда будет равен "sizeof (указатель)".
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
31.08.2015, 08:50
А почему у меня параметр img.png не передается recognition.exe???
C++
1
2
 if (!CreateProcess(L"recognition.exe",L"-img.png",NULL,NULL,TRUE,HIGH_PRIORITY_CLASS,
                     NULL,NULL,&si,&pi))
Так как выше запускаю и программа запускается без параметра.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
31.08.2015, 09:42
Цитата Сообщение от ninja2 Посмотреть сообщение
А почему
2-й параметр - командная строка целиком
"recognition.exe -img.png"
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
31.08.2015, 10:13
Цитата Сообщение от Байт Посмотреть сообщение
2-й параметр - командная строка целиком
"recognition.exe -img.png"
Да ясно, а как сделать если первый параметр будет NULL???
От типо так
C++
1
2
if (!CreateProcess(NULL,L"recognition.exe img.png",NULL,NULL,TRUE,HIGH_PRIORITY_CLASS,
                     NULL,NULL,&si,&pi))
Вроде пишут что и так должно работать как то но не работает?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
31.08.2015, 10:52
Цитата Сообщение от ninja2 Посмотреть сообщение
но не работает?
"Не работает" - так говорят блондинки.
Мы, программисты, даем коды ошибок, исключений, stack trace, дампы, логи и скриншоты.

P.S.
Второй аргумент CreateProcessXxxW должен быть доступен на запись.
Такая вот особенность у этого семейства функций (документированная, кстати).
2
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.08.2015, 11:52
Цитата Сообщение от ninja2 Посмотреть сообщение
Вроде пишут что и так должно работать как то но не работает?
см #18
0
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
31.08.2015, 14:26
Цитата Сообщение от Убежденный Посмотреть сообщение
P.S.
Второй аргумент CreateProcessXxxW должен быть доступен на запись.
Такая вот особенность у этого семейства функций (документированная, кстати).
Как на запись, от вроде сделал через переменную и все рамно не работает
C++
1
2
3
4
TCHAR * ARGV =L"recognition.exe img.png";
  //создаем дочерний процесс
  if (!CreateProcess(NULL,ARGV,NULL,NULL,TRUE,HIGH_PRIORITY_CLASS,
                     NULL,NULL,&si,&pi))
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
31.08.2015, 14:39
Цитата Сообщение от ninja2 Посмотреть сообщение
Как на запись, от вроде сделал через переменную и все рамно не работает
Строковые литералы константны.
Используй или локальный массив wchar_t или буфер wchar_t, выделенный в динамической памяти.
Или std::vector<wchar_t> в качестве буфера.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.08.2015, 14:57
Eсть std::wstring;

Я обычно делаю так:
C++
1
2
typedef TCHAR tchar;
typedef std::basic_string<tchar> tstring;
А подставляю
C++
1
 const_cast<tchar*>(ts.c_str());
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
31.08.2015, 14:58
Цитата Сообщение от Убежденный Посмотреть сообщение
Или std::vector<wchar_t> в качестве буфера.
а почему не std::wstring тогда уж?
0
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
31.08.2015, 15:04
Цитата Сообщение от Убежденный Посмотреть сообщение
Строковые литералы константны.
Используй или локальный массив wchar_t или буфер wchar_t, выделенный в динамической памяти.
Или std::vector<wchar_t> в качестве буфера.
хз. че оно константно если бы const стояло..., на фанарь так сделал
C++
1
TCHAR ARGV[] =L"recognition.exe img.png";
Заработало.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
31.08.2015, 15:07
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
typedef TCHAR tchar;
Зачем такой хитрый tolower?
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
const_cast<tchar*>(ts.c_str());
Тут можно и UB словить между делом, имхо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.08.2015, 15:07

Два взаимосвязанных ListBox'a
Доброго времени суток! Помогите, пожалуйста, по такому вопросу: есть ListBox1 и ListBox2. При нажатии на элемент ListBox1 должен...

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

два взаимосвязанных spinbox
Здравствуйте .Столкнулся со следующей проблемой. На форме есть два spinbox один - ширина изображения в пикселях, второй - высота. При...

Два взаимосвязанных поля input
Здравствуйте прошу помочь... не могу понять как создать два взаимосвязанных поля input например в первый input1 вводится значение 10 а...

Два взаимосвязанных SELECTa на VBScript
Нашел тут хороший пример от Zombie по взаимосвязанной работе 2-х select_ov, не поделится ли кто аналогичным тока на VBScript ? Пример хочу...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru