ideas icon indicating copy to clipboard operation
ideas copied to clipboard

Аналог GetModuleFileName

Open astafiev555 opened this issue 2 years ago • 0 comments

Очень не хватает в современном стандарте функции, которая возвращает абсолютный путь относительно исполняемого файла (получение текущей директории - типа getCWD не подходит в некоторых случаях, т.к. текущая директория не обязана всегда указывать на папку, где лежит исполняемый файл)

(Требуется очень часто загружать какие-то конфигурационные файлы из папок, расположение которых жёстко фиксировано относительно исполняемого файла)

Один из вариантов реализации такой функции (get_main_module_path, пример):

#include

std::filesystem::path get_main_module_path();

#ifdef _MSC_VER #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <tchar.h>

std::filesystem::path get_main_module_path() { TCHAR gPath[FILENAME_MAX + 1]; int32_t sz = GetModuleFileName(nullptr, gPath, FILENAME_MAX); if (sz >= 0) { gPath[sz] = _T('\0'); } TCHAR *fnd = _tcsrchr(gPath, _T('\')); if (fnd) { fnd[1] = _T('\0'); } std::filesystem::path ret = gPath; return ret; } #else #include #include #include <unistd.h>

std::filesystem::path get_main_module_path() { char gPath[FILENAME_MAX + 1]; char buff[64]; uint32_t pid = (uint32_t)getpid(); int32_t sz = 0; #if defined(__sun) || defined(sun) sprintf(buff, "/proc/%u/path/a.out", pid); #else sprintf(buff, "/proc/%u/exe", pid); sz = (int32_t)readlink(buff, gPath, FILENAME_MAX); #endif if (sz >= 0) { gPath[sz] = '\0'; } char *fnd = strrchr(gPath, '/'); if (fnd) { fnd[1] = '\0'; } std::filesystem::path ret = gPath; return ret; } #endif

astafiev555 avatar Dec 04 '23 06:12 astafiev555