X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=cbits%2FdirUtils.c;h=1e981d3c2f473d8aece89b86ba052bf43046dd07;hb=4a83f322cdf4374c7e4bce4c7f32ad07203d55b8;hp=0e769729208e2d3251887560e95ca572e247213a;hpb=6f8f4783b00b5b56c663b06aa6b8449f4f3e1c83;p=ghc-base.git diff --git a/cbits/dirUtils.c b/cbits/dirUtils.c index 0e76972..1e981d3 100644 --- a/cbits/dirUtils.c +++ b/cbits/dirUtils.c @@ -4,17 +4,17 @@ * Directory Runtime Support */ -#include "config.h" +#include "ghcconfig.h" // The following is required on Solaris to force the POSIX versions of // the various _r functions instead of the Solaris versions. -#ifdef solaris2_TARGET_OS +#ifdef solaris2_HOST_OS #define _POSIX_PTHREAD_SEMANTICS #endif #include "HsBase.h" -#if defined(mingw32_TARGET_OS) || defined(__MINGW32__) || defined(_MSC_VER) +#if defined(mingw32_HOST_OS) || defined(__MINGW32__) || defined(_MSC_VER) #include static @@ -117,7 +117,7 @@ HsInt __hscore_renameFile( HsAddr src, HsAddr dest) { -#if defined(mingw32_TARGET_OS) || defined(__MINGW32__) || defined(_MSC_VER) +#if defined(mingw32_HOST_OS) || defined(__MINGW32__) || defined(_MSC_VER) static int forNT = -1; /* ToDo: propagate error codes back */ @@ -172,3 +172,47 @@ __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; + /* The DLLs to try loading entry point from */ + char* dlls[] = { "shell32.dll", "shfolder.dll" }; + + if (loaded_dll < 0) { + return (-1); + } else if (loaded_dll == 0) { + int i; + for(i=0;i < sizeof(dlls); i++) { + hMod = LoadLibrary(dlls[i]); + if ( hMod != NULL && + (funcPtr = (HSCORE_GETAPPFOLDERFUNTY)GetProcAddress(hMod, "SHGetFolderPathA")) ) { + loaded_dll = 1; + break; + } + } + if (loaded_dll == 0) { + loaded_dll = (-1); + return (-1); + } + } + /* OK, if we got this far the function has been bound */ + return (int)funcPtr(hwndOwner,nFolder,hToken,dwFlags,pszPath); + /* ToDo: unload the DLL on shutdown? */ +} +#endif