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

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

Войти
Регистрация
Восстановить пароль
 
lord2894
0 / 0 / 0
Регистрация: 28.07.2014
Сообщений: 4
#1

Вызов стороннего приложения без полного пути - C++

28.07.2014, 11:40. Просмотров 659. Ответов 7
Метки нет (Все метки)

Всем доброго времени суток!
Подсобите в следующем вопросе пожалуйста:
Язык C++ среда разработки Visual Studio 2012, мне требуется запустить стороннее приложение (.exe) с параметрами, аналогия со строкой cmd : lspl-find.exe -i arg1 -p arg2 -o arg 3 arg4, перерыл кучу инфы по этому поводу, нашел множество функций выполняющих данную задачу (spawnl, execl, ShellExecute, CreateProcess, ...), однако, как я понял, они все требуют полный путь к запускаемому exe файлу и к параметрам(если они файлы).
Это была, так сказать, предыстория, а теперь собственно вопрос: нельзя ли как-то обойтись без полного пути, если запускаемая утилита лежит в папке с программой?
Так например сделано в Java :

Java
1
2
3
4
5
6
7
8
9
10
command = new ArrayList<String>();
command.add("bin\\lspl-find");
command.add("-i");
command.add("parsing text\\out_text.txt");
command.add("-p");
command.add("parsing text\\patterns.txt");
command.add("-o");
command.add("parsing text\\output.xml");
command.add("Definition");
ProcessBuilder builder = new ProcessBuilder(command);
При такой записи Java будет брать папку bin непосредственно рядом с программой, да и остальные файлы тоже.
В С++, точно знаю, такое прокатывает, например, со считыванием из фала .txt, т.е. если он лежит рядом с прогой, то не надо указывать полный путь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2014, 11:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вызов стороннего приложения без полного пути (C++):

#include ,указание файла без полного пути. - C++
По сабжу,есть 2010 студия,есть чужой код.Решил сесть,разобраться,и натолкнулся на такой вариант #includeа . #include &lt;mem/raw.h&gt; У меня...

Не хочет создавать файл без полного пути - C++
Здравствуйте. Вот не могу понять в чем дело: std::ofstream outfile; //откроем файл для записи в бин режиме ...

Процедура разбора полного пути к файлу, представленного строкой - C++
Разработать процедуру (и вспомогательную программу) разбора заданной текстовой строки (задается переменной окружения или параметром...

Из полного пути к файлу выделить только имя файла - C++
Написать программу, которая по введённому полному пути к файлу выделяла бы только имя файла (то, что следует после последнего слеша или...

Расщепление полного пути к файлу на диск, директорий...(неясность в задании) - C++
Доброго времени суток! Не ожидал от препода излишней адекватности,но сейчас я в ступоре... вот текст задания: &quot; Написать функцию...

Запуск из программы стороннего приложения в DOS - C++
Добрый день! Необходимо в ходе выполнения программы запустить другое .exe приложение в DOS. Гугл не помог, все ссылки выводятся на...

7
Ilot
Модератор
Эксперт С++
1818 / 1176 / 232
Регистрация: 16.05.2013
Сообщений: 3,105
Записей в блоге: 5
Завершенные тесты: 1
28.07.2014, 11:44 #2
Цитата Сообщение от lord2894 Посмотреть сообщение
нельзя ли как-то обойтись без полного пути, если запускаемая утилита лежит в папке с программой?
Конечно CreateProcess
1
lord2894
0 / 0 / 0
Регистрация: 28.07.2014
Сообщений: 4
28.07.2014, 14:00  [ТС] #3
Цитата Сообщение от Ilot Посмотреть сообщение
Конечно CreateProcess
Прошу прощения, а не подскажете как мне добиться нужного результата?
С тех пор как Вы ответили и до сего момента целенаправленно искал информацию по CreateProcess, однако добился лишь запуска с указанием полного пути. Хотя казалось бы аргумент lpCurrentDirectory как раз за это и отвечает.
lpCurrentDirectory - указывает текущий диск и каталог, если NULL то будет использован диск и каталог процесса родителя
На деле же ничего не выходит использую, следующий код(где lspl-console.exe не требует параметров, хотябы ее для теста запустить) :
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
PROCESS_INFORMATION pi;
    STARTUPINFO si = {sizeof(si)};
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_SHOWNORMAL;
    // Set up members of the PROCESS__INFORMATION structure. 
    ZeroMemory( &pi, sizeof(PROCESS_INFORMATION) );
    DWORD ec;
    // Create the child process. 
    if(!CreateProcess(NULL,
        "bin\\lspl-console.exe", // comment  "\\bin\\lspl-console.exe" ".\\bin\\lspl-console.exe"
        NULL, 
        NULL, 
        FALSE, 
        0, 
        NULL, 
        NULL, 
        &si, 
        &pi))
    {
        ec = GetLastError();
        return -1;
    }
    WaitForSingleObject(pi.hProcess, INFINITE);
    if(GetExitCodeProcess(pi.hProcess, &ec))
        return ec;
    return -2;
0
Убежденный
Системный программист
Эксперт С++
15618 / 7127 / 1128
Регистрация: 02.05.2013
Сообщений: 11,567
Записей в блоге: 1
Завершенные тесты: 1
28.07.2014, 14:58 #4
lpCurrentDirectory отвечает за то, какой путь будет установлен в качестве
"текущей папки" для запущенного процесса. Он никак не помогает в поиске
exe запускаемого файла.

И я так и не понял, чем не устраивает вариант с указанием полного пути ?

По теме: могу посоветовать где-нибудь на старте программы вызвать SetCurrentDirectory,
установив папку, где лежит exe, в качестве текущей. Но это немного топорно, т.к.
функция влияет на все потоки процесса. В больших проектах неприменимо, потому что
не знаешь, где и кто ее еще мог вызвать.
1
lord2894
0 / 0 / 0
Регистрация: 28.07.2014
Сообщений: 4
28.07.2014, 15:42  [ТС] #5
Цитата Сообщение от Убежденный Посмотреть сообщение
lpCurrentDirectory отвечает за то, какой путь будет установлен в качестве
"текущей папки" для запущенного процесса. Он никак не помогает в поиске
exe запускаемого файла.

И я так и не понял, чем не устраивает вариант с указанием полного пути ?

По теме: могу посоветовать где-нибудь на старте программы вызвать SetCurrentDirectory,
установив папку, где лежит exe, в качестве текущей. Но это немного топорно, т.к.
функция влияет на все потоки процесса. В больших проектах неприменимо, потому что
не знаешь, где и кто ее еще мог вызвать.
Указание полного пути тоже проблематично, поскольку я могу лишь утверждать, что вызываемая утилита будет в папке с программой, а где будет сама программа это вопрос. Более того, насколько я знаю, получение полного пути, например так:
C++
1
2
char pth[MAX_PATH];
    GetCurrentDirectory(sizeof(pth), pth)
не всегда возвращает то что требуется. Блин неужели на плюсах нельзя сделать то, что требуется также легко как на Java

Добавлено через 18 минут
Насчет SetCurrentDirectory(), правильно ли я понимаю, что данная функция устанавливает как раз то , что возвращает GetCurrentDirectory(), если да, то как это поможет?
Ведь GetCurrentDirectory() и так на данном этапе возвращает мне то, что надо(полный путь)
0
krv
73 / 53 / 11
Регистрация: 10.07.2014
Сообщений: 328
28.07.2014, 16:28 #6
ParamStr(0) вернет полный путь к твоей запущенной программе.
если чистый Си - это 0й элемент в массиве параметров при вызове main - argv
C++
1
int main(int argc, char *argv[])
1
lord2894
0 / 0 / 0
Регистрация: 28.07.2014
Сообщений: 4
28.07.2014, 16:52  [ТС] #7
Значит только через полный путь... жаль. Ну что ж всем спасибо за ответы!
0
Убежденный
Системный программист
Эксперт С++
15618 / 7127 / 1128
Регистрация: 02.05.2013
Сообщений: 11,567
Записей в блоге: 1
Завершенные тесты: 1
28.07.2014, 17:02 #8
Цитата Сообщение от lord2894 Посмотреть сообщение
Указание полного пути тоже проблематично, поскольку я могу лишь утверждать, что вызываемая утилита будет в папке с программой, а где будет сама программа это вопрос.
Тоже мне проблему нашли
GetModuleFileName возвращает полный путь к exe. Дальше обрезаете все, что за
последним слэшем (проще всего через wstring.find_last_of и wstring.substr) и к
этой строке добавляете имя exe.

Цитата Сообщение от lord2894 Посмотреть сообщение
[GetCurrentDirectory] не всегда возвращает то что требуется.
GetCurrentDirectory возвращает текущую директорию.
Это не обязательно та директория, в которой лежит exe.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.07.2014, 17:02
Привет! Вот еще темы с ответами:

Создать ListBox в окне стороннего приложения - C++
ListBox на чужем окне..........на VC++ Как это реализовать.....?

Вызов одного приложения из других - C++
Доброго времени суток дамы (уж если таковые тут имеются) и господа (что более вероятно)! Столкнулся я вот с какой проблемой - приступив к...

Вызов других программ из консольного приложения - C++
как с помощью консоли другие программы? Т.е например,я в консоли ввожу &quot;Какой либо текст&quot; и он должен мне будет открыть...

Как происходит вызов одного приложения другим? - C++
Здравствуйте. Пишу набор консольных утилит, столкнулся с проблемой того, что функция API копирования файла срабатывает при запуске...


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

Или воспользуйтесь поиском по форуму:
8
Yandex
Объявления
28.07.2014, 17:02
Ответ Создать тему
Опции темы

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