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

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

Восстановить пароль Регистрация
 
lord2894
0 / 0 / 0
Регистрация: 28.07.2014
Сообщений: 4
28.07.2014, 11:40     Вызов стороннего приложения без полного пути #1
Всем доброго времени суток!
Подсобите в следующем вопросе пожалуйста:
Язык 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, т.е. если он лежит рядом с прогой, то не надо указывать полный путь.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
28.07.2014, 11:44     Вызов стороннего приложения без полного пути #2
Цитата Сообщение от lord2894 Посмотреть сообщение
нельзя ли как-то обойтись без полного пути, если запускаемая утилита лежит в папке с программой?
Конечно CreateProcess
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;
Убежденный
Системный программист
 Аватар для Убежденный
14184 / 6199 / 984
Регистрация: 02.05.2013
Сообщений: 10,325
Завершенные тесты: 1
28.07.2014, 14:58     Вызов стороннего приложения без полного пути #4
lpCurrentDirectory отвечает за то, какой путь будет установлен в качестве
"текущей папки" для запущенного процесса. Он никак не помогает в поиске
exe запускаемого файла.

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

По теме: могу посоветовать где-нибудь на старте программы вызвать SetCurrentDirectory,
установив папку, где лежит exe, в качестве текущей. Но это немного топорно, т.к.
функция влияет на все потоки процесса. В больших проектах неприменимо, потому что
не знаешь, где и кто ее еще мог вызвать.
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() и так на данном этапе возвращает мне то, что надо(полный путь)
krv
71 / 51 / 11
Регистрация: 10.07.2014
Сообщений: 328
28.07.2014, 16:28     Вызов стороннего приложения без полного пути #6
ParamStr(0) вернет полный путь к твоей запущенной программе.
если чистый Си - это 0й элемент в массиве параметров при вызове main - argv
C++
1
int main(int argc, char *argv[])
lord2894
0 / 0 / 0
Регистрация: 28.07.2014
Сообщений: 4
28.07.2014, 16:52  [ТС]     Вызов стороннего приложения без полного пути #7
Значит только через полный путь... жаль. Ну что ж всем спасибо за ответы!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.07.2014, 17:02     Вызов стороннего приложения без полного пути
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Убежденный
Системный программист
 Аватар для Убежденный
14184 / 6199 / 984
Регистрация: 02.05.2013
Сообщений: 10,325
Завершенные тесты: 1
28.07.2014, 17:02     Вызов стороннего приложения без полного пути #8
Цитата Сообщение от lord2894 Посмотреть сообщение
Указание полного пути тоже проблематично, поскольку я могу лишь утверждать, что вызываемая утилита будет в папке с программой, а где будет сама программа это вопрос.
Тоже мне проблему нашли
GetModuleFileName возвращает полный путь к exe. Дальше обрезаете все, что за
последним слэшем (проще всего через wstring.find_last_of и wstring.substr) и к
этой строке добавляете имя exe.

Цитата Сообщение от lord2894 Посмотреть сообщение
[GetCurrentDirectory] не всегда возвращает то что требуется.
GetCurrentDirectory возвращает текущую директорию.
Это не обязательно та директория, в которой лежит exe.
Yandex
Объявления
28.07.2014, 17:02     Вызов стороннего приложения без полного пути
Ответ Создать тему
Опции темы

Текущее время: 09:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru