From 23172bcdd093ac618e6e9d718cde54fa9e72dd78 Mon Sep 17 00:00:00 2001 From: James Turner Date: Wed, 19 Jun 2013 23:58:57 +0100 Subject: [PATCH] Windows SGPath::desktop() impl Basic SHGetSpecialFolderPath wrapper, with dynamic finding of the function since linking to shell32.dll is painful. Obviously could be generalised to other CSIDLs in the future. --- simgear/misc/sg_path.cxx | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/simgear/misc/sg_path.cxx b/simgear/misc/sg_path.cxx index 9267cedf..69d1ac44 100644 --- a/simgear/misc/sg_path.cxx +++ b/simgear/misc/sg_path.cxx @@ -519,11 +519,32 @@ SGPath SGPath::home() #endif #ifdef _WIN32 + +#include // for CSIDL + //------------------------------------------------------------------------------ SGPath SGPath::desktop() { - // TODO - return SGPath(); + typedef BOOL (WINAPI*GetSpecialFolderPath)(HWND, LPSTR, int, BOOL); + static GetSpecialFolderPath SHGetSpecialFolderPath = NULL; + + // lazy open+resolve of shell32 + if (!SHGetSpecialFolderPath) { + HINSTANCE shellDll = ::LoadLibrary("shell32"); + SHGetSpecialFolderPath = (GetSpecialFolderPath) GetProcAddress(shellDll, "SHGetSpecialFolderPathA"); + } + + if (!SHGetSpecialFolderPath){ + return SGPath(); + } + + char path[MAX_PATH]; + if (SHGetSpecialFolderPath(0, path, CSIDL_DESKTOPDIRECTORY, false)) { + return SGPath(path); + } + + SG_LOG(SG_GENERAL, SG_ALERT, "SGPath::desktop() failed, bad" ); + return SGPath(); } #elif __APPLE__ #include