From: James Turner Date: Wed, 19 Jun 2013 22:58:57 +0000 (+0100) Subject: Windows SGPath::desktop() impl X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=23172bcdd093ac618e6e9d718cde54fa9e72dd78;p=simgear.git 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. --- 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