module System.Win32.Shell (
sHGetFolderPath,
CSIDL,
cSIDL_PROFILE,
cSIDL_APPDATA,
cSIDL_WINDOWS,
cSIDL_PERSONAL,
cSIDL_PROGRAM_FILES,
SHGetFolderPathFlags,
sHGFP_TYPE_CURRENT,
sHGFP_TYPE_DEFAULT
) where
import System.Win32.Types
import Graphics.Win32.GDI.Types (HWND)
import Foreign
import Foreign.C
import Control.Monad
import System.IO.Error
#include "windows_cconv.h"
type CSIDL = CInt
cSIDL_PROFILE :: CSIDL
cSIDL_PROFILE = 40
cSIDL_APPDATA :: CSIDL
cSIDL_APPDATA = 26
cSIDL_WINDOWS :: CSIDL
cSIDL_WINDOWS = 36
cSIDL_PERSONAL :: CSIDL
cSIDL_PERSONAL = 5
cSIDL_PROGRAM_FILES :: CSIDL
cSIDL_PROGRAM_FILES = 38
type SHGetFolderPathFlags = DWORD
sHGFP_TYPE_CURRENT :: SHGetFolderPathFlags
sHGFP_TYPE_CURRENT = 0
sHGFP_TYPE_DEFAULT :: SHGetFolderPathFlags
sHGFP_TYPE_DEFAULT = 1
sHGetFolderPath :: HWND -> CSIDL -> HANDLE -> SHGetFolderPathFlags -> IO String
sHGetFolderPath hwnd csidl hdl flags =
allocaBytes ((260) * ((1))) $ \pstr -> do
r <- c_SHGetFolderPath hwnd csidl hdl flags pstr
when (r < 0) $ raiseUnsupported "sHGetFolderPath"
peekTString pstr
raiseUnsupported :: String -> IO ()
raiseUnsupported loc =
ioError (ioeSetErrorString (mkIOError illegalOperationErrorType loc Nothing Nothing) "unsupported operation")
foreign import WINDOWS_CCONV unsafe "SHGetFolderPathW"
c_SHGetFolderPath :: HWND -> CInt -> HANDLE -> DWORD -> LPTSTR
-> IO HRESULT