Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Аналог GetModuleFileName #584

Open
astafiev555 opened this issue Dec 4, 2023 · 0 comments
Open

Аналог GetModuleFileName #584

astafiev555 opened this issue Dec 4, 2023 · 0 comments

Comments

@astafiev555
Copy link

Очень не хватает в современном стандарте функции, которая возвращает абсолютный путь относительно исполняемого файла (получение текущей директории - типа 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant