С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
vasadisim
1 / 1 / 0
Регистрация: 19.12.2011
Сообщений: 88
Завершенные тесты: 1
1

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

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

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

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

Чтение исполняемого PE файла
Здравствуйте программисты. Недавно увлекся исследованием PE файлов и решил...

Подключения заголовочного и исполняемого файла
Есть 3 файла: Main.cpp: #include <iostream> using namespace std; ...

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

Ошибка при запуске исполняемого файла
Требование к разработке: Разработать программы для генерации и проверки...

11
Dragokas
Эксперт WindowsАвтор FAQ
17031 / 7089 / 857
Регистрация: 25.12.2011
Сообщений: 10,914
Записей в блоге: 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
17031 / 7089 / 857
Регистрация: 25.12.2011
Сообщений: 10,914
Записей в блоге: 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
1866 / 924 / 154
Регистрация: 10.12.2013
Сообщений: 3,100
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
17031 / 7089 / 857
Регистрация: 25.12.2011
Сообщений: 10,914
Записей в блоге: 16
09.09.2016, 18:09 7
Лучший ответ Сообщение было отмечено vasadisim как решение

Решение

Ну вообще, это в раздел 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
2838 / 2405 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
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
17031 / 7089 / 857
Регистрация: 25.12.2011
Сообщений: 10,914
Записей в блоге: 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

Как добавить версию исполняемого файла?
В большенстве файлов *.exe в свойствах имеется вкладка &quot;Версия&quot; в которой Имена...

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

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


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

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

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