Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
vasadisim
1 / 1 / 0
Регистрация: 19.12.2011
Сообщений: 88
Завершенные тесты: 1
#1

Запуск исполняемого файла - C++

09.09.2016, 13:22. Просмотров 522. Ответов 11
Метки нет (Все метки)

Как запустить исполняемый exe файл с параметрами в командной строке чтобы исполняемый файл отрабатывал по пути указанному в командной строке
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2016, 13:22
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Запуск исполняемого файла (C++):

Чтение исполняемого PE файла - C++
Здравствуйте программисты. Недавно увлекся исследованием PE файлов и решил написать небольшую программку для чтения из них Проблема...

версия исполняемого файла - C++
В большенстве файлов *.exe в свойствах имеется вкладка "Версия" в которой Имена элементов "Версия продукта", "Версия файла", "Внутреннее...

Размер исполняемого файла - C++
почему при не особо больших изменениях размер ИФ не увеличивается и не уменьшается?

Исходный код исполняемого файла C++... - C++
Искал в инете декомпилятор, нашёл OLLYDBG, но ничего, похожего на исходный код он мне не выдал... Помогите плиз вытащить исходник из...

Подключения заголовочного и исполняемого файла - C++
Есть 3 файла: Main.cpp: #include <iostream> using namespace std; #include "example.h" int main() { example<int> *A =...

Ошибка при запуске исполняемого файла - C++
Требование к разработке: Разработать программы для генерации и проверки подписей по ГОСТ Р34.10-94. Рекомендуемые значения общих открытых...

11
Dragokas
Эксперт WindowsАвтор FAQ
16614 / 6999 / 848
Регистрация: 25.12.2011
Сообщений: 10,795
Записей в блоге: 16
09.09.2016, 13:55 #2
Windows Batch file
1
"путь\файл" аргументы
Не совсем понятно, что значит:
Цитата Сообщение от vasadisim Посмотреть сообщение
отрабатывал по пути указанному в командной строке
Если подразумевается установка рабочего каталога, то:

либо:

Windows Batch file
1
2
cd /d "путь"
"файл" аргументы
либо

Windows Batch file
1
start "" /d "путь" "файл" аргументы
0
vasadisim
1 / 1 / 0
Регистрация: 19.12.2011
Сообщений: 88
Завершенные тесты: 1
09.09.2016, 14:03  [ТС] #3
Dragokas, Вот нужно чтобы этот файл отрабатывал, в заданном с командной строки каталоге
0
Вложения
Тип файла: rar prog.rar (18.8 Кб, 6 просмотров)
Dragokas
Эксперт WindowsАвтор FAQ
16614 / 6999 / 848
Регистрация: 25.12.2011
Сообщений: 10,795
Записей в блоге: 16
09.09.2016, 16:42 #4
Ну и зачем Вы выложили сюда исполняемый файл, господин Тарарыкин ? (лучше бы показали исходник или ссылку на свою тему)
На форум запрещено такие вещи выкладывать, в смысле из малоизвестного источника.
А если уж кому-то и передаёте, побеспокойтесь, что у файла нет зависимостей.

Этот файл не был написан по стандарту, так чтобы принимать параметры командной строки. По этому поводу Вы можете задать вопрос в раздел C++.
Тем не менее командную строку Вы всё же можете заставить передать в cin текст, например, так:

Windows Batch file
1
echo C:\Users\Alex\Desktop|prog.exe
0
Миниатюры
Запуск исполняемого файла  
vasadisim
1 / 1 / 0
Регистрация: 19.12.2011
Сообщений: 88
Завершенные тесты: 1
09.09.2016, 16:47  [ТС] #5
Dragokas, как мне путь задавать из командной строки,а не из программы
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include "stdafx.h"
#include <stdio.h> 
#include <conio.h>
#include <math.h>
#include <string>
 
using namespace std;
int main()
{
    char buf[2];
    FLOAT dwSize = 0;
    cout << "Enter the path to the directory ( Example C:\\ ):" << endl;
    wstring folderpath;
    std::getline(wcin, folderpath);
    wcout << L"Directory: " << folderpath << endl;
    WIN64_FIND_DATA fd;
    // Начать поиск всех файлов в корне диска C:
    HANDLE const hFind = FindFirstFileW((folderpath + L"\\*").c_str(), &fd);
    do
    {
        // Если ошибка поиска(например, нет диска С):
        if (hFind == INVALID_HANDLE_VALUE) std::cout << "Error: the directory doesn't exist";
        else
        {
            std::wstring path = folderpath + L"\" + fd.cFileName;
            HANDLE hFile = hFile = CreateFile(path.c_str(), GENERIC_READ, NULL, NULL, OPEN_EXISTING, NULL, NULL);
            if (hFile == INVALID_HANDLE_VALUE)
            {
                CloseHandle(hFile);
                continue;
            }
            DWORD nRead;
            BOOL res = ReadFile(hFile, buf, 2, &nRead, NULL);
            dwSize = GetFileSize(hFile, NULL);
            if (buf[0] == 'M' && buf[1] == 'Z')
            {  
                std::wcout << "Executable file (PE)!""\n";
                // Вывести имя файла на экран:
                std::wcout  << fd.cFileName << "\n";
                //Перевести дату создания из времени по Гринвичу в локальное время:
                FileTimeToLocalFileTime(&fd.ftCreationTime, &fd.ftCreationTime);
                // Выполнить конвертирование из FILETIME в SYSTEMTIME:
                SYSTEMTIME st;
                if (FileTimeToSystemTime(&fd.ftCreationTime, &st) == TRUE)
                {
                    // Вывести дату на экран:
                    cout << st.wDay << "-" << st.wMonth << "-" << st.wYear << " " << st.wHour << ":" << st.wMinute << ":" << st.wSecond << " ";
                    // Вывести размер файла:
                    cout << dwSize / 1024 << "[KB]" << endl;
                }
            }
 
            CloseHandle(hFile);
        }
        // Перевод на новую строку (для вывода след. файла):
        std::cout << "\n";
        // Найти следующий файл, удовлетворяющий условиям поиска. Если файл найден, повторить цикл:
    } while (FindNextFile(hFind, &fd));
    // Завершить поиск:
    FindClose(hFind);
    // Ожидание нажатия любой клавиши (чтобы не закрылось окно):
    system("pause");
    return 0;
}
0
volodin661
1738 / 849 / 139
Регистрация: 10.12.2013
Сообщений: 2,897
09.09.2016, 18:07 #6
параметры ком. строки обрабатываются в функции main путём задания
аргументов int argc и char **argv ( см. пример ниже )

C++ (Qt)
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
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
 
void _tmain(int argc, TCHAR *argv[])
{
   WIN32_FIND_DATA FindFileData;
   HANDLE hFind;
 
   if( argc != 2 )
   {
      _tprintf(TEXT("Usage: %s [target_file]\n"), argv[0]);
      return;
   }
 
   _tprintf (TEXT("Target file is %s\n"), argv[1]);
   hFind = FindFirstFile(argv[1], &FindFileData);
   if (hFind == INVALID_HANDLE_VALUE) 
   {
      printf ("FindFirstFile failed (%d)\n", GetLastError());
      return;
   } 
   else 
   {
      _tprintf (TEXT("The first file found is %s\n"), 
                FindFileData.cFileName);
      FindClose(hFind);
   }
}
0
Dragokas
Эксперт WindowsАвтор FAQ
16614 / 6999 / 848
Регистрация: 25.12.2011
Сообщений: 10,795
Записей в блоге: 16
09.09.2016, 18:09 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ну вообще, это в раздел C++.

Но могу и здесь кое-что посоветовать:

Два раза повторяется
Цитата Сообщение от vasadisim Посмотреть сообщение
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include "stdafx.h"
Что это?
Цитата Сообщение от vasadisim Посмотреть сообщение
HANDLE hFile = hFile = CreateFile(
Зачем здесь закрывать?
Цитата Сообщение от vasadisim Посмотреть сообщение
if (hFile == INVALID_HANDLE_VALUE)
* * * * * * {
* * * * * * * * CloseHandle(hFile);
Неверный тип данных:
Цитата Сообщение от vasadisim Посмотреть сообщение
FLOAT dwSize = 0;
Проверок на ошибки не хватает. Хотя бы у FindFirstFileW. Еще ReadFile.

У CreateFile неправильно заданы параметры. И еще права расшаривания желательно всегда указывать. Есть большой шанс нарваться на блокировку, если файл уже открыт кем-то ещё.

Цитата Сообщение от vasadisim Посмотреть сообщение
как мне путь задавать из командной строки,а не из программы
например, заменить на юникодную точку входа с передачей аргументов командной строки:

C++
1
int _tmain(int argc, _TCHAR* argv[])
соответственно заголовочный файл:
Windows Batch file
1
#include <tchar.h>
Затем проверяете кол-во полученных аргументов (argc) и преобразовываете аргументы в тип wstring:

Windows Batch file
1
folderpath = std::wstring(argv[1]);
Итого:

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <iostream>
#include <string>
#include <Windows.h>
#include <tchar.h>
 
int _tmain(int argc, _TCHAR* argv[])
{
    char buf[2];
    DWORD dwSize = 0;
    std::wstring folderpath;
    WIN32_FIND_DATA fd;
 
    if (argc > 1) {
        folderpath = std::wstring(argv[1]);
    }
    else {
        std::cout << "Enter the path to the directory ( Example C:\\ ):" << std::endl;
        std::getline(std::wcin, folderpath);
    }
 
    std::wcout << L"Directory: " << folderpath << std::endl;
 
    // Начать поиск всех файлов в корне диска C:
    HANDLE const hFind = FindFirstFileW((folderpath + L"\\*").c_str(), &fd);
 
    if (hFind != INVALID_HANDLE_VALUE) {
        do
        {
            // Если ошибка поиска(например, нет диска С):
            if (hFind != INVALID_HANDLE_VALUE)
            {
                std::wstring path = folderpath + L"\\" + fd.cFileName;
 
                HANDLE hFile = CreateFile(path.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, 0, NULL);
 
                if (hFile != INVALID_HANDLE_VALUE)
                {
                    DWORD nRead;
                    if (ReadFile(hFile, buf, 2, &nRead, NULL)) {
 
                        if (buf[0] == 'M' && buf[1] == 'Z')
                        {
                            std::wcout << "Executable file (PE)!""\n";
                            // Вывести имя файла на экран:
                            std::wcout << fd.cFileName << "\n";
                            //Перевести дату создания из времени по Гринвичу в локальное время:
                            FileTimeToLocalFileTime(&fd.ftCreationTime, &fd.ftCreationTime);
                            // Выполнить конвертирование из FILETIME в SYSTEMTIME:
                            SYSTEMTIME st;
                            if (FileTimeToSystemTime(&fd.ftCreationTime, &st) == TRUE)
                            {
                                // Вывести дату на экран:
                                std::cout << st.wDay << "-" << st.wMonth << "-" << st.wYear << " " << st.wHour << ":" << st.wMinute << ":" << st.wSecond << " ";
                            }
                            // Вывести размер файла:
                            dwSize = GetFileSize(hFile, NULL);
                            std::cout << dwSize / 1024 << "[KB]" << std::endl;
                        }
                    }
                    else {
                        std::cout << "Error: cannot read file!" << std::endl;
                    }
                    CloseHandle(hFile);
                }
            }
            // Перевод на новую строку (для вывода след. файла):
            std::cout << "\n";
            // Найти следующий файл, удовлетворяющий условиям поиска. Если файл найден, повторить цикл:
        } while (FindNextFile(hFind, &fd));
        // Завершить поиск:
        FindClose(hFind);
    } else {
        std::cout << "Error: the directory doesn't exist" << std::endl;
    }
    // Ожидание нажатия любой клавиши (чтобы не закрылось окно):
    system("pause");
    return 0;
}
2
vasadisim
1 / 1 / 0
Регистрация: 19.12.2011
Сообщений: 88
Завершенные тесты: 1
09.09.2016, 20:53  [ТС] #8
Dragokas, спасибо большое, а запуск из командой строки с указанным в нем путем как осуществить?
0
nd2
2821 / 2391 / 851
Регистрация: 29.01.2016
Сообщений: 8,004
09.09.2016, 20:56 #9
Цитата Сообщение от vasadisim Посмотреть сообщение
а запуск из командой строки с указанным в нем путем как осуществить?
...
Как передать аргументы из командной строки в функцию main(), что программа заработала? (файловый ввод/вывод)
0
vasadisim
1 / 1 / 0
Регистрация: 19.12.2011
Сообщений: 88
Завершенные тесты: 1
09.09.2016, 23:14  [ТС] #10
Dragokas, а почему такие пробелы при выводе? Как их ликвидировать?
0
Миниатюры
Запуск исполняемого файла  
Dragokas
Эксперт WindowsАвтор FAQ
16614 / 6999 / 848
Регистрация: 25.12.2011
Сообщений: 10,795
Записей в блоге: 16
10.09.2016, 00:17 #11
Цитата Сообщение от vasadisim Посмотреть сообщение
а запуск из командой строки с указанным в нем путем как осуществить?
Все варианты уже перечислены во 2-м посте и продемонстрировано на скриншоте.
Чтобы попасть в консоль, нажмите комбинацию клавиш Win + R, вводим CMD, нажимаем {ENTER}.

Если в пути есть пробелы или спецсимволы, путь заключается в кавычки.

Цитата Сообщение от vasadisim Посмотреть сообщение
а почему такие пробелы при выводе? Как их ликвидировать?
C++
1
std::cout << "\n";
из-под цикла уберите.

Добавлено через 17 минут
А только не знаю, как грамотно переключиться на юникодную консоль.
Если заменить все cout на wcout, затем, например, создать PE EXE с ALT + 3333 в имени, то консоль сожрёт все, что будет после такого знака. Переключение на utf-8 не помогает:
C++
1
SetConsoleCP(65001);
0
vasadisim
1 / 1 / 0
Регистрация: 19.12.2011
Сообщений: 88
Завершенные тесты: 1
10.09.2016, 00:28  [ТС] #12
Dragokas, спасибо большое за помощь
0
10.09.2016, 00:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.09.2016, 00:28
Привет! Вот еще темы с ответами:

Как изменить иконку исполняемого файла - C++
Добрый день. Написал игру маленькую, консольную. Решил послать её другу. Но у экзешника не красивая иконка. Долго ползал на форуме...

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

Как узнать директорию расположения исполняемого файла? - C++
Мне нужна именно папка расположения исполняемого файла, без имени файла. GetCurrentDirectory выдает не верный путь. Хотелось бы...

Поиск файлов, относительно исполняемого файла программы - C++
я новичок в программировании. да и плохо владею английским. потому здесь мой последний шанс. делаю игру через SFML и использую Tiled для...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru