{-# LINE 1 "System\\Win32\\WindowsString\\DLL.hsc" #-}
module System.Win32.WindowsString.DLL
( module System.Win32.WindowsString.DLL
, module System.Win32.DLL
) where
import System.Win32.DLL hiding
( disableThreadLibraryCalls
, freeLibrary
, getModuleFileName
, getModuleHandle
, getProcAddress
, loadLibrary
, loadLibraryEx
, setDllDirectory
, lOAD_LIBRARY_AS_DATAFILE
, lOAD_WITH_ALTERED_SEARCH_PATH
)
import System.Win32.DLL.Internal
import System.Win32.WindowsString.Types
import Foreign
import Data.Maybe (fromMaybe)
import System.OsString.Windows
import GHC.IO.Encoding.UTF16 ( mkUTF16le )
import GHC.IO.Encoding.Failure ( CodingFailureMode(..) )
getModuleFileName :: HMODULE -> IO WindowsString
getModuleFileName :: HMODULE -> IO WindowsString
getModuleFileName HMODULE
hmod =
Int -> (Ptr TCHAR -> IO WindowsString) -> IO WindowsString
forall a b. Storable a => Int -> (Ptr a -> IO b) -> IO b
allocaArray Int
512 ((Ptr TCHAR -> IO WindowsString) -> IO WindowsString)
-> (Ptr TCHAR -> IO WindowsString) -> IO WindowsString
forall a b. (a -> b) -> a -> b
$ \ Ptr TCHAR
c_str -> do
String -> IO Bool -> IO ()
failIfFalse_ String
"GetModuleFileName" (IO Bool -> IO ()) -> IO Bool -> IO ()
forall a b. (a -> b) -> a -> b
$ HMODULE -> Ptr TCHAR -> Int -> IO Bool
c_GetModuleFileName HMODULE
hmod Ptr TCHAR
c_str Int
512
Ptr TCHAR -> IO WindowsString
peekTString Ptr TCHAR
c_str
getModuleHandle :: Maybe WindowsString -> IO HMODULE
getModuleHandle :: Maybe WindowsString -> IO HMODULE
getModuleHandle Maybe WindowsString
mb_name =
(WindowsString -> (Ptr TCHAR -> IO HMODULE) -> IO HMODULE)
-> Maybe WindowsString -> (Ptr TCHAR -> IO HMODULE) -> IO HMODULE
forall a b c.
(a -> (Ptr b -> IO c) -> IO c)
-> Maybe a -> (Ptr b -> IO c) -> IO c
maybeWith WindowsString -> (Ptr TCHAR -> IO HMODULE) -> IO HMODULE
forall a. WindowsString -> (Ptr TCHAR -> IO a) -> IO a
withTString Maybe WindowsString
mb_name ((Ptr TCHAR -> IO HMODULE) -> IO HMODULE)
-> (Ptr TCHAR -> IO HMODULE) -> IO HMODULE
forall a b. (a -> b) -> a -> b
$ \ Ptr TCHAR
c_name ->
String -> IO HMODULE -> IO HMODULE
forall a. String -> IO (Ptr a) -> IO (Ptr a)
failIfNull String
"GetModuleHandle" (IO HMODULE -> IO HMODULE) -> IO HMODULE -> IO HMODULE
forall a b. (a -> b) -> a -> b
$ Ptr TCHAR -> IO HMODULE
c_GetModuleHandle Ptr TCHAR
c_name
loadLibrary :: WindowsString -> IO HMODULE
loadLibrary :: WindowsString -> IO HMODULE
loadLibrary WindowsString
name =
WindowsString -> (Ptr TCHAR -> IO HMODULE) -> IO HMODULE
forall a. WindowsString -> (Ptr TCHAR -> IO a) -> IO a
withTString WindowsString
name ((Ptr TCHAR -> IO HMODULE) -> IO HMODULE)
-> (Ptr TCHAR -> IO HMODULE) -> IO HMODULE
forall a b. (a -> b) -> a -> b
$ \ Ptr TCHAR
c_name ->
String -> IO HMODULE -> IO HMODULE
forall a. String -> IO (Ptr a) -> IO (Ptr a)
failIfNull String
"LoadLibrary" (IO HMODULE -> IO HMODULE) -> IO HMODULE -> IO HMODULE
forall a b. (a -> b) -> a -> b
$ Ptr TCHAR -> IO HMODULE
c_LoadLibrary Ptr TCHAR
c_name
loadLibraryEx :: WindowsString -> HANDLE -> LoadLibraryFlags -> IO HMODULE
loadLibraryEx :: WindowsString -> HMODULE -> LoadLibraryFlags -> IO HMODULE
loadLibraryEx WindowsString
name HMODULE
h LoadLibraryFlags
flags =
WindowsString -> (Ptr TCHAR -> IO HMODULE) -> IO HMODULE
forall a. WindowsString -> (Ptr TCHAR -> IO a) -> IO a
withTString WindowsString
name ((Ptr TCHAR -> IO HMODULE) -> IO HMODULE)
-> (Ptr TCHAR -> IO HMODULE) -> IO HMODULE
forall a b. (a -> b) -> a -> b
$ \ Ptr TCHAR
c_name ->
String -> IO HMODULE -> IO HMODULE
forall a. String -> IO (Ptr a) -> IO (Ptr a)
failIfNull String
"LoadLibraryEx" (IO HMODULE -> IO HMODULE) -> IO HMODULE -> IO HMODULE
forall a b. (a -> b) -> a -> b
$ Ptr TCHAR -> HMODULE -> LoadLibraryFlags -> IO HMODULE
c_LoadLibraryEx Ptr TCHAR
c_name HMODULE
h LoadLibraryFlags
flags
setDllDirectory :: Maybe WindowsString -> IO ()
setDllDirectory :: Maybe WindowsString -> IO ()
setDllDirectory Maybe WindowsString
name =
(WindowsString -> (Ptr TCHAR -> IO ()) -> IO ())
-> Maybe WindowsString -> (Ptr TCHAR -> IO ()) -> IO ()
forall a b c.
(a -> (Ptr b -> IO c) -> IO c)
-> Maybe a -> (Ptr b -> IO c) -> IO c
maybeWith WindowsString -> (Ptr TCHAR -> IO ()) -> IO ()
forall a. WindowsString -> (Ptr TCHAR -> IO a) -> IO a
withTString Maybe WindowsString
name ((Ptr TCHAR -> IO ()) -> IO ()) -> (Ptr TCHAR -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ Ptr TCHAR
c_name -> do
let nameS :: Maybe String
nameS = Maybe WindowsString
name Maybe WindowsString
-> (WindowsString -> Maybe String) -> Maybe String
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (EncodingException -> Maybe String)
-> (String -> Maybe String)
-> Either EncodingException String
-> Maybe String
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (Maybe String -> EncodingException -> Maybe String
forall a b. a -> b -> a
const Maybe String
forall a. Maybe a
Nothing) String -> Maybe String
forall a. a -> Maybe a
Just (Either EncodingException String -> Maybe String)
-> (WindowsString -> Either EncodingException String)
-> WindowsString
-> Maybe String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TextEncoding -> WindowsString -> Either EncodingException String
decodeWith (CodingFailureMode -> TextEncoding
mkUTF16le CodingFailureMode
TransliterateCodingFailure)
String -> IO Bool -> IO ()
failIfFalse_ ([String] -> String
unwords [String
"SetDllDirectory", String -> Maybe String -> String
forall a. a -> Maybe a -> a
fromMaybe String
"NULL" Maybe String
nameS]) (IO Bool -> IO ()) -> IO Bool -> IO ()
forall a b. (a -> b) -> a -> b
$ Ptr TCHAR -> IO Bool
c_SetDllDirectory Ptr TCHAR
c_name