Как получить 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;
}
Другие вопросы по тегам