From 365220d3b8579305fb2c3797dfbca6ecfa7ca834 Mon Sep 17 00:00:00 2001 From: Danny Robson Date: Tue, 8 May 2012 15:05:23 +1000 Subject: [PATCH] Add Win32 implementation of image_path --- exe.cpp | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/exe.cpp b/exe.cpp index fc1ac3c3..3514d53b 100644 --- a/exe.cpp +++ b/exe.cpp @@ -22,7 +22,7 @@ #include "platform.hpp" -#ifdef PLATFORM_LINUX +#if defined(PLATFORM_LINUX) #include "types.hpp" #include "except.hpp" @@ -57,6 +57,37 @@ retry: return boost::filesystem::path (resolved.data (), resolved.data () + written); } +#elif defined(PLATFORM_WIN32) + +#include "except.hpp" + +#include + +boost::filesystem::path +util::image_path (void) { + std::vector resolved (256); + +retry: + const auto written = GetModuleFileName (nullptr, resolved.data (), resolved.size ()); + if (written == 0) + win32_error::throw_code (); + + if (written == resolved.size ()) { + resolved.resize (resolved.size () * 2); + goto retry; + } + + return boost::filesystem::path (resolved.data (), resolved.data () + written); +} + #else #error "Unknown platform" + +// Mac OS X: _NSGetExecutablePath() (man 3 dyld) +// Linux: readlink /proc/self/exe +// Solaris: getexecname() +// FreeBSD: sysctl CTL_KERN KERN_PROC KERN_PROC_PATHNAME -1 +// BSD with procfs: readlink /proc/curproc/file +// Windows: GetModuleFileName() with hModule = NULL + #endif