Add util::executable_path()

This commit is contained in:
Nikita Lisitsa 2023-07-14 20:54:41 +03:00
parent ffe7afff1f
commit 42f986ce4a
2 changed files with 46 additions and 0 deletions

View file

@ -0,0 +1,10 @@
#pragma once
#include <filesystem>
namespace psemek::util
{
std::filesystem::path executable_path();
}

View file

@ -0,0 +1,36 @@
#include <psemek/util/executable_path.hpp>
#include <psemek/util/to_string.hpp>
#ifdef WIN32
#include <libloaderapi.h>
#include <errhandlingapi.h>
#include <winerror.h>
#endif
namespace psemek::util
{
std::filesystem::path executable_path()
{
#if defined WIN32
std::string result(256, '\0');
while (true)
{
GetModuleFileNameA(NULL, result.data(), result.size());
auto error = GetLastError();
if (error == ERROR_SUCCESS)
break;
else if (error == ERROR_INSUFFICIENT_BUFFER)
result.resize(result.size() * 2);
else
throw std::runtime_error(util::to_string("failed to retrieve executable path: ", std::hex, error));
}
return std::filesystem::path(result);
#elif defined __linux__
return std::filesystem::canonical("/proc/self/exe");
#else
throw std::runtime_error("executable_path() is not implemented for this platform");
#endif
}
}