(Multi OS) Получить путь к исполняемому файлу

У меня есть программа, которая имеет двоичные файлы для многих разных ОС

Мне нужно, чтобы получить местоположение двоичного файла (думаю, автообновление)

Как это сделать в «вашей» ОС?

(Думайте об этом как о проблеме, своего рода :))

РЕДАКТИРОВАТЬ Примечание. Программа может быть переносной (запускать с флэш-накопителя и т. Д.) Или быть установлена ​​(например, изначально в формате .deb).

EDIT2: вот что у меня уже есть:

/**
* Get the location of the executable
* @return the location of the executable, as a string.
*/
const char *GetExecutableLocation()
{
const char *path;
char buf[1024];

#if defined (WIN32) || defined (WIN64)
GetModuleFileName(path, &size);
#elif defined (__APPLE__)
_NSGetExecutablePath(path, &size);
#elif defined(UNIX)
if (readlink("/proc/self/exe", buf, sizeof(buf)) == -1) path = buf;
#elif defined(__FreeBSD__)
int mib[4];
mib[0] = CTL_KERN;
mib[1] = KERN_PROC;
mib[2] = KERN_PROC_PATHNAME;
mib[3] = -1;
sysctl(mib, 4, buf, sizeof(buf), NULL, 0);
path = buf;
#elif defined(SUNOS)
path = getexecname();
#endif
return path;
}

(обратите внимание, что я только что протестировал раздел Unix, я не знаю больше ни о чем)

1

Решение

Нет портативного способа.

Грубые идеи для основных операционных систем (я опускаю детали здесь):

  • Windows: вызовите GetModuleFileNameW (nullptr), чтобы получить путь к исполняемой программе
  • MacOS: используйте [[NSBundle mainBundle] bundlePath], чтобы получить основной каталог пакета (также есть вызов для самого исполняемого файла, но большую часть времени вы хотите найти свои файлы данных). Вам нужно будет скомпилировать этот кусок как Objective-C ++; Я думал об использовании CFBundle, но в то время это было слишком грязно.
  • Linux: нет «действительно хорошего» способа. Я остановился на readlink (/ proc /<mypid>/ exe), который будет работать в большинстве случаев. Сбой при вызове программы через жесткую ссылку.

Примечание: argv [0] обычно бесполезен; он дает имя, которое использовалось для вызова программы в консольной среде, но не разрешает пути поиска оболочки и может быть недоступно в некоторых средах. Он не существует в программах с графическим интерфейсом Windows, и я даже не уверен, что MacOS передает как argv [0], когда вы запускаете программу через графический интерфейс.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector