diff options
author | Egor Tensin <Egor.Tensin@gmail.com> | 2020-10-18 03:20:06 +0300 |
---|---|---|
committer | Egor Tensin <Egor.Tensin@gmail.com> | 2020-10-18 03:20:06 +0300 |
commit | 01e95de886413c252ee1a419ed0a7c41435847e6 (patch) | |
tree | e001a71ef743285e75bf01409b33a4b42a37e7da /src | |
parent | cmake: files are per-directory, not per-extension (diff) | |
download | winapi-common-01e95de886413c252ee1a419ed0a7c41435847e6.tar.gz winapi-common-01e95de886413c252ee1a419ed0a7c41435847e6.zip |
Process: add get_exe_path()
Diffstat (limited to 'src')
-rw-r--r-- | src/path.cpp | 5 | ||||
-rw-r--r-- | src/process.cpp | 26 |
2 files changed, 30 insertions, 1 deletions
diff --git a/src/path.cpp b/src/path.cpp index 2c2deda..3df5918 100644 --- a/src/path.cpp +++ b/src/path.cpp @@ -16,8 +16,11 @@ namespace winapi { namespace { std::wstring do_canonicalize(const std::wstring& path) { + BOOST_STATIC_CONSTEXPR std::size_t init_buffer_size = MAX_PATH; + static_assert(init_buffer_size > 0, "init_buffer_size must be positive"); + std::vector<wchar_t> buffer; - buffer.resize(MAX_PATH); + buffer.resize(init_buffer_size); while (true) { const auto nch = ::GetFullPathNameW(path.c_str(), buffer.size(), buffer.data(), NULL); diff --git a/src/process.cpp b/src/process.cpp index d3ce3a4..7e3a9e7 100644 --- a/src/process.cpp +++ b/src/process.cpp @@ -122,6 +122,32 @@ HMODULE Process::get_exe_module() { return module; } +std::string Process::get_exe_path() { + BOOST_STATIC_CONSTEXPR std::size_t init_buffer_size = MAX_PATH; + static_assert(init_buffer_size > 0, "init_buffer_size must be positive"); + + std::vector<wchar_t> buffer; + buffer.resize(init_buffer_size); + + while (true) { + SetLastError(ERROR_SUCCESS); + + const auto nch = ::GetModuleFileNameW(NULL, buffer.data(), buffer.size()); + + if (nch == 0) { + throw error::windows(GetLastError(), "GetModuleFileNameW"); + } + + if (nch == buffer.size() && GetLastError() == ERROR_INSUFFICIENT_BUFFER) { + buffer.resize(2 * buffer.size()); + continue; + } + + buffer.resize(nch); + return narrow(buffer); + } +} + std::string Process::get_resource_string(unsigned int id) { wchar_t* s = nullptr; |