X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=cbits%2FdirUtils.c;h=86b36579176d2adcc2e9bdb912d970333ba821f0;hb=dd70cacd4793c4497136829c50ef31f330163638;hp=fdcdf295d3d3fe921081ceb0b466bc0f9a699a39;hpb=90f7b6cec2b034721ec0b7c015a23ec0aed63100;p=ghc-base.git diff --git a/cbits/dirUtils.c b/cbits/dirUtils.c index fdcdf29..86b3657 100644 --- a/cbits/dirUtils.c +++ b/cbits/dirUtils.c @@ -172,3 +172,45 @@ __hscore_renameFile( HsAddr src, #endif } +/* + * Function: __hscore_getFolderPath() + * + * Late-bound version of SHGetFolderPath(), coping with OS versions + * that have shell32's lacking that particular API. + * + */ +#if defined(mingw32_HOST_OS) || defined(__MINGW32__) || defined(_MSC_VER) +typedef HRESULT (*HSCORE_GETAPPFOLDERFUNTY)(HWND,int,HANDLE,DWORD,char*); +int +__hscore_getFolderPath(HWND hwndOwner, + int nFolder, + HANDLE hToken, + DWORD dwFlags, + char* pszPath) +{ + static int loaded_dll = 0; + static HMODULE hMod = (HMODULE)NULL; + static HSCORE_GETAPPFOLDERFUNTY funcPtr = NULL; + + if (loaded_dll < 0) { + return (-1); + } else if (loaded_dll == 0) { + hMod = LoadLibrary("shell32.dll"); + if (hMod == NULL) { + loaded_dll = (-1); + return (-1); + } else { + funcPtr = (HSCORE_GETAPPFOLDERFUNTY)GetProcAddress(hMod, "SHGetFolderPathA"); + if (!funcPtr) { + loaded_dll = (-1); + return (-1); + } else { + loaded_dll = 1; + } + } + } + /* OK, if we got this far the function has been bound */ + return (int)funcPtr(hwndOwner,nFolder,hToken,dwFlags,pszPath); + /* ToDo: unload the DLL? */ +} +#endif