Как получить AppPath в каталог исполняемого файла, используя язык C в Windows (используя MinGW gcc)
Мой исполняемый файл находится в этом месте -> D:\ examples\C_Pro\newApp.exe Также в этой папке "C_Pro" содержится несколько файлов ( file1.txt, file2.txt, file44.exe, newApp.c)
В моем файле newApp.c я включаю функцию ShellExecute для выполнения файла "file44.exe" в той же папке, как эта -> ShellExecute(NULL,"open","D:\ examples\C_Pro\file44.exe",NULL,NULL,1)
таким образом все работает правильно..
Я говорю о AppPath, как вещь в VB
Но дело в том, что я хочу запустить этот newApp.exe на разных компьютерах, поэтому я хочу заменить "D: \ examples\C_Pro\" на любой путь, содержащий файл "newApp.exe" на другом компьютере (например, C:\Программного обеспечения\)
Я получаю путь с помощью функции GetModuleFileName, но она содержит часть newApp.exe, которую я хочу только в той точке, в которой новая функция PathRemoveFileSpec каталога не работает.
а также путь возврата GetModuleFileName, например -> D:\ examples\C_Pro\newApp.exe, но когда мы указываем некоторый путь в ShellEcxecute, требуется двойной shalse (последовательность пробелов), например, -> D:\ examples \ C_Pro \
Как я могу избавиться от этой проблемы.
Фактический фрагмент кода это...
int main()
{
ShellExecute(NULL,"open","D:\\Softwares\\TypingMaster700.exe",NULL,NULL,SW_SHOWNORMAL);
}
Но я хочу сделать так. (это фиктивная, здесь "some_Funtion" означает фиктивную функцию для целей объяснения.
int main()
{
char *dirPath = some_Function(a,x,d);
char *fullPath;
fullPath = strcat(dirPath,"\\TypingMaster700.exe");
ShellExecute(NULL,"open",fullPath,NULL,NULL,SW_SHOWNORMAL);
}
2 ответа
Получение абсолютного пути к каталогу, в котором расположен исполняемый файл, стандартно не поддерживается в стандарте C, поскольку не все системы, в которых работает программа, поддерживают такую концепцию. Тем не менее на практике это желательная функция. Короче говоря: хороший вопрос.
К сожалению, это не так просто, и если ваша программа вызывается с помощью execl
cs это может быть даже невозможно. Вам нужно будет воспроизвести оболочку, чтобы определить, какое приложение запустить и с чего начать. argv[0]
как и paulsm4. В Linux, если путь начинается с /
, затем argv[0]
это абсолютный путь к исполняемому файлу, и вы можете найти каталог, удалив имя исполняемого файла в конце. В Windows вам нужно будет проверить \
и возможно буква диска, я не уверен. Мы возьмем Linux на себя, просто прочитайте \
для каждого /
применить это к Windows.
Если argv[0]
не является абсолютным путем, как указано выше, вы должны проверить, содержит ли он какие-либо /
вообще, потому что если это так, то это должно быть относительно getcwd
как было описано также paulsm4.
Если argv[0]
не содержит никаких /
то вам придется пробежать через PATH
переменная окружения, чтобы найти первый каталог, содержащий argv[0]
,
Если это все не удается, ваше приложение было вызвано через execl
или один из его друзей, и они не были честны о расположении исполняемого файла. Вам не повезло.
Примерно так работает на Windows:
#include <stdio.h>
#include <stdlib.h>
int
main (int argc, char *argv[])
{
char buff[255];
getcwd (buff, sizeof (buff));
printf ("path=%s\\%s\n", buff, argv[0]);
return 0;
}