module System.Win32.Com.Base where
import System.Win32.Com.HDirect.Pointer ( makeFO, finalNoFree )
import System.Win32.Com.HDirect.HDirect
import Foreign.ForeignPtr
import Foreign.Ptr
import Data.Dynamic
import Data.Int
import Data.Word ( Word32 )
import System.IO.Unsafe ( unsafePerformIO )
import System.Win32.Com.HDirect.WideString ( WideString, marshallWideString, freeWideString,
readWideString, writeWideString )
import System.IO ( hPutStrLn, stderr )
import Control.Exception
import Data.Typeable
newtype IUnknown_ a = Unknown (ForeignPtr ())
type IUnknown a = IUnknown_ a
type HRESULT = Int32
failed :: HRESULT -> Bool
failed hr = hr < 0
ifaceToAddr :: IUnknown a -> Ptr b
ifaceToAddr (Unknown x) = castPtr (foreignPtrToPtr x)
addrToIPointer :: Bool -> Ptr b -> IO (IUnknown a)
addrToIPointer finaliseMe x = do
i <- makeFO x (castPtrToFunPtr $ if finaliseMe then addrOfReleaseIUnknown else finalNoFree)
return (Unknown i)
marshallIUnknown :: IUnknown a -> IO (ForeignPtr b)
marshallIUnknown (Unknown x) = return (castForeignPtr x)
checkHR :: HRESULT -> IO ()
checkHR hr
| failed hr = coFailHR hr
| otherwise = return ()
coFailHR :: HRESULT -> IO a
coFailHR hr = do
str <- stringFromHR hr
coFailWithHR hr str
newtype ComError = ComError HRESULT
deriving ( Show )
data ComException
= ComException
{ comException :: ComError
, comExceptionMsg :: String
} deriving (Typeable,Show)
comExceptionHR :: ComException -> HRESULT
comExceptionHR ComException{comException=ComError hr} = hr
comErrorTc = mkTyCon3 "com2" "System.Win32.Com.Base" "ComError"
data SomeCOMException = forall e . Exception e => SomeCOMException e
deriving Typeable
instance Show SomeCOMException where
show (SomeCOMException e) = show e
instance Exception SomeCOMException
comToException :: Exception e => e -> SomeException
comToException = toException . SomeCOMException
comFromException :: Exception e => SomeException -> Maybe e
comFromException x = do
SomeCOMException a <- fromException x
cast a
throwComException :: ComException -> IO a
throwComException c = throwIO (toException c)
instance Exception ComException where
toException = comToException
fromException = comFromException
coFailWithHR :: HRESULT -> String -> IO a
coFailWithHR hr msg = throwComException ComException{comException=(ComError hr),comExceptionMsg=msg}
stringFromHR :: HRESULT -> IO String
stringFromHR hr = do
pstr <- hresultString hr
unmarshallString (castPtr pstr)
comInitialize :: IO ()
comInitialize =
do
o_comInitialize <- prim_System_Win32_Com_Base_comInitialize
checkHR o_comInitialize
foreign import ccall "comInitialize" prim_System_Win32_Com_Base_comInitialize :: IO Int32
comUnInitialize :: IO ()
comUnInitialize =
prim_System_Win32_Com_Base_comUnInitialize
foreign import ccall "comUnInitialize" prim_System_Win32_Com_Base_comUnInitialize :: IO ()
messageBox :: Ptr Char
-> Ptr Char
-> Word32
-> IO ()
messageBox str title flg =
prim_System_Win32_Com_Base_messageBox str
title
flg
foreign import ccall "messageBox" prim_System_Win32_Com_Base_messageBox :: Ptr Char -> Ptr Char -> Word32 -> IO ()
type PIID = Ptr ()
type PCLSID = Ptr ()
type PGUID = Ptr ()
primCLSIDFromProgID :: Ptr Char
-> PCLSID
-> IO ()
primCLSIDFromProgID str rptr =
do
o_primCLSIDFromProgID <- prim_System_Win32_Com_Base_primCLSIDFromProgID str rptr
checkHR o_primCLSIDFromProgID
foreign import ccall "primCLSIDFromProgID" prim_System_Win32_Com_Base_primCLSIDFromProgID :: Ptr Char -> Ptr () -> IO Int32
primProgIDFromCLSID :: ForeignPtr ()
-> IO (Ptr ())
primProgIDFromCLSID pclsid =
do
pwide <- allocBytes (fromIntegral sizeofPtr)
o_primProgIDFromCLSID <- withForeignPtr pclsid (\ pclsid -> prim_System_Win32_Com_Base_primProgIDFromCLSID pclsid pwide)
checkHR o_primProgIDFromCLSID
doThenFree free readPtr pwide
foreign import ccall "primProgIDFromCLSID" prim_System_Win32_Com_Base_primProgIDFromCLSID :: Ptr () -> Ptr (Ptr ()) -> IO Int32
primStringToGUID :: Ptr Wchar_t
-> Ptr ()
-> IO ()
primStringToGUID str pguid =
do
o_primStringToGUID <- prim_System_Win32_Com_Base_primStringToGUID str pguid
checkHR o_primStringToGUID
foreign import ccall "primStringToGUID" prim_System_Win32_Com_Base_primStringToGUID :: Ptr Word16 -> Ptr () -> IO Int32
primGUIDToString :: ForeignPtr ()
-> IO (Ptr ())
primGUIDToString guid =
do
str <- allocBytes (fromIntegral sizeofPtr)
o_primGUIDToString <- withForeignPtr guid (\ guid -> prim_System_Win32_Com_Base_primGUIDToString guid str)
checkHR o_primGUIDToString
doThenFree free readPtr str
foreign import ccall "primGUIDToString" prim_System_Win32_Com_Base_primGUIDToString :: Ptr () -> Ptr (Ptr ()) -> IO Int32
primCopyGUID :: ForeignPtr ()
-> PGUID
-> IO ()
primCopyGUID pguid1 pguid2 =
do
o_primCopyGUID <- withForeignPtr pguid1 (\ pguid1 -> prim_System_Win32_Com_Base_primCopyGUID pguid1 pguid2)
checkHR o_primCopyGUID
foreign import ccall "primCopyGUID" prim_System_Win32_Com_Base_primCopyGUID :: Ptr () -> Ptr () -> IO Int32
primNewGUID :: ForeignPtr ()
-> IO ()
primNewGUID pguid =
do
o_primNewGUID <- withForeignPtr pguid (\ pguid -> prim_System_Win32_Com_Base_primNewGUID pguid)
checkHR o_primNewGUID
foreign import ccall "primNewGUID" prim_System_Win32_Com_Base_primNewGUID :: Ptr () -> IO Int32
bindObject :: Ptr Wchar_t
-> ForeignPtr ()
-> IO (Ptr (Ptr ()))
bindObject name iid =
do
ppv <- allocBytes (fromIntegral sizeofPtr)
o_bindObject <- withForeignPtr iid (\ iid -> prim_System_Win32_Com_Base_bindObject name iid ppv)
checkHR o_bindObject
return (ppv)
foreign import ccall "bindObject" prim_System_Win32_Com_Base_bindObject :: Ptr Word16 -> Ptr () -> Ptr (Ptr ()) -> IO Int32
primComEqual :: IUnknown a0
-> IUnknown a1
-> IO Bool
primComEqual unk1 unk2 =
do
unk1 <- marshallIUnknown unk1
unk2 <- marshallIUnknown unk2
o_primComEqual <- withForeignPtr unk1 (\ unk1 -> withForeignPtr unk2 (\ unk2 -> prim_System_Win32_Com_Base_primComEqual unk1 unk2))
unmarshallBool o_primComEqual
foreign import ccall "primComEqual" prim_System_Win32_Com_Base_primComEqual :: Ptr (IUnknown a) -> Ptr (IUnknown a) -> IO Int32
isEqualGUID :: ForeignPtr ()
-> ForeignPtr ()
-> Bool
isEqualGUID guid1 guid2 =
unsafePerformIO (withForeignPtr guid1 (\ guid1 -> withForeignPtr guid2 (\ guid2 -> prim_System_Win32_Com_Base_isEqualGUID guid1 guid2)) >>= \ o_isEqualGUID ->
unmarshallBool o_isEqualGUID)
foreign import stdcall "IsEqualGUID" prim_System_Win32_Com_Base_isEqualGUID :: Ptr () -> Ptr () -> IO Int32
lOCALE_USER_DEFAULT :: Word32
lOCALE_USER_DEFAULT =
unsafePerformIO (prim_System_Win32_Com_Base_lOCALE_USER_DEFAULT)
foreign import ccall "lOCALE_USER_DEFAULT" prim_System_Win32_Com_Base_lOCALE_USER_DEFAULT :: IO Word32
primCreateTypeLib :: Int32
-> WideString
-> IO (Ptr (Ptr ()))
primCreateTypeLib skind lpkind =
do
ppv <- allocBytes (fromIntegral sizeofPtr)
lpkind <- marshallWideString lpkind
o_primCreateTypeLib <- prim_System_Win32_Com_Base_primCreateTypeLib skind lpkind ppv
freeWideString lpkind
checkHR o_primCreateTypeLib
return (ppv)
foreign import ccall "primCreateTypeLib" prim_System_Win32_Com_Base_primCreateTypeLib :: Int32 -> Ptr WideString -> Ptr (Ptr ()) -> IO Int32
getLastError :: IO Word32
getLastError = prim_System_Win32_Com_Base_getLastError
foreign import stdcall "GetLastError" prim_System_Win32_Com_Base_getLastError :: IO Word32
hresultString :: Int32
-> IO (Ptr ())
hresultString i = prim_System_Win32_Com_Base_hresultString i
foreign import ccall "hresultString" prim_System_Win32_Com_Base_hresultString :: Int32 -> IO (Ptr ())
coCreateInstance :: ForeignPtr ()
-> ForeignPtr ()
-> Int32
-> ForeignPtr ()
-> Ptr ()
-> IO ()
coCreateInstance clsid inner ctxt riid ppv =
do
o_coCreateInstance <- withForeignPtr clsid (\ clsid -> withForeignPtr inner (\ inner -> withForeignPtr riid (\ riid -> prim_System_Win32_Com_Base_coCreateInstance clsid inner ctxt riid ppv)))
checkHR o_coCreateInstance
foreign import stdcall "CoCreateInstance" prim_System_Win32_Com_Base_coCreateInstance :: Ptr () -> Ptr () -> Int32 -> Ptr () -> Ptr () -> IO Int32
type ULONG = Word32
type DWORD = Word32
data COAUTHIDENTITY = COAUTHIDENTITY {user :: String,
domain :: String,
password :: String,
flags :: ULONG}
writeCOAUTHIDENTITY :: Ptr COAUTHIDENTITY
-> COAUTHIDENTITY
-> IO ()
writeCOAUTHIDENTITY ptr (COAUTHIDENTITY user domain password flags) =
let
userLength = (fromIntegral (length user) :: Word32)
in
do
user <- marshallString user
let domainLength = (fromIntegral (length domain) :: Word32)
domain <- marshallString domain
let passwordLength = (fromIntegral (length password) :: Word32)
password <- marshallString password
let pf0 = ptr
pf1 = addNCastPtr pf0 0
writePtr pf1 user
let pf2 = addNCastPtr pf1 4
writeWord32 pf2 userLength
let pf3 = addNCastPtr pf2 4
writePtr pf3 domain
let pf4 = addNCastPtr pf3 4
writeWord32 pf4 domainLength
let pf5 = addNCastPtr pf4 4
writePtr pf5 password
let pf6 = addNCastPtr pf5 4
writeWord32 pf6 passwordLength
let pf7 = addNCastPtr pf6 4
writeWord32 pf7 flags
readCOAUTHIDENTITY :: Ptr COAUTHIDENTITY
-> IO COAUTHIDENTITY
readCOAUTHIDENTITY ptr =
let
pf0 = ptr
pf1 = addNCastPtr pf0 0
in
do
user <- readPtr pf1
let pf2 = addNCastPtr pf1 4
userLength <- readWord32 pf2
let pf3 = addNCastPtr pf2 4
domain <- readPtr pf3
let pf4 = addNCastPtr pf3 4
domainLength <- readWord32 pf4
let pf5 = addNCastPtr pf4 4
password <- readPtr pf5
let pf6 = addNCastPtr pf5 4
passwordLength <- readWord32 pf6
let pf7 = addNCastPtr pf6 4
flags <- readWord32 pf7
userLength <- unmarshallWord32 userLength
domainLength <- unmarshallWord32 domainLength
passwordLength <- unmarshallWord32 passwordLength
user <- unmarshallString user
domain <- unmarshallString domain
password <- unmarshallString password
return (COAUTHIDENTITY user domain password flags)
sizeofCOAUTHIDENTITY :: Word32
sizeofCOAUTHIDENTITY = 28
data COAUTHINFO = COAUTHINFO {dwAuthnSvc :: DWORD,
dwAuthzSvc :: DWORD,
pwszServerPrincName :: WideString,
dwAuthnLevel :: DWORD,
dwImpersonationLevel :: DWORD,
pAuthIdentityData :: (Maybe COAUTHIDENTITY),
dwCapabilities :: DWORD}
writeCOAUTHINFO :: Ptr COAUTHINFO
-> COAUTHINFO
-> IO ()
writeCOAUTHINFO ptr (COAUTHINFO dwAuthnSvc dwAuthzSvc pwszServerPrincName dwAuthnLevel dwImpersonationLevel pAuthIdentityData dwCapabilities) =
let
pf0 = ptr
pf1 = addNCastPtr pf0 0
in
do
writeWord32 pf1 dwAuthnSvc
let pf2 = addNCastPtr pf1 4
writeWord32 pf2 dwAuthzSvc
let pf3 = addNCastPtr pf2 4
writeWideString pf3 pwszServerPrincName
let pf4 = addNCastPtr pf3 4
writeWord32 pf4 dwAuthnLevel
let pf5 = addNCastPtr pf4 4
writeWord32 pf5 dwImpersonationLevel
let pf6 = addNCastPtr pf5 4
writeunique (allocBytes (fromIntegral sizeofCOAUTHIDENTITY)) writeCOAUTHIDENTITY pf6 pAuthIdentityData
let pf7 = addNCastPtr pf6 4
writeWord32 pf7 dwCapabilities
readCOAUTHINFO :: Ptr COAUTHINFO
-> IO COAUTHINFO
readCOAUTHINFO ptr =
let
pf0 = ptr
pf1 = addNCastPtr pf0 0
in
do
dwAuthnSvc <- readWord32 pf1
let pf2 = addNCastPtr pf1 4
dwAuthzSvc <- readWord32 pf2
let pf3 = addNCastPtr pf2 4
pwszServerPrincName <- readWideString pf3
let pf4 = addNCastPtr pf3 4
dwAuthnLevel <- readWord32 pf4
let pf5 = addNCastPtr pf4 4
dwImpersonationLevel <- readWord32 pf5
let pf6 = addNCastPtr pf5 4
pAuthIdentityData <- readunique readCOAUTHIDENTITY pf6
let pf7 = addNCastPtr pf6 4
dwCapabilities <- readWord32 pf7
return (COAUTHINFO dwAuthnSvc dwAuthzSvc pwszServerPrincName dwAuthnLevel dwImpersonationLevel pAuthIdentityData dwCapabilities)
sizeofCOAUTHINFO :: Word32
sizeofCOAUTHINFO = 28
data COSERVERINFO = COSERVERINFO {dwReserved1 :: DWORD,
pwszName :: WideString,
pAuthInfo :: (Maybe COAUTHINFO),
dwReserved2 :: DWORD}
writeCOSERVERINFO :: Ptr COSERVERINFO
-> COSERVERINFO
-> IO ()
writeCOSERVERINFO ptr (COSERVERINFO dwReserved1 pwszName pAuthInfo dwReserved2) =
let
pf0 = ptr
pf1 = addNCastPtr pf0 0
in
do
writeWord32 pf1 dwReserved1
let pf2 = addNCastPtr pf1 4
writeWideString pf2 pwszName
let pf3 = addNCastPtr pf2 4
writeunique (allocBytes (fromIntegral sizeofCOAUTHINFO)) writeCOAUTHINFO pf3 pAuthInfo
let pf4 = addNCastPtr pf3 4
writeWord32 pf4 dwReserved2
readCOSERVERINFO :: Ptr COSERVERINFO
-> IO COSERVERINFO
readCOSERVERINFO ptr =
let
pf0 = ptr
pf1 = addNCastPtr pf0 0
in
do
dwReserved1 <- readWord32 pf1
let pf2 = addNCastPtr pf1 4
pwszName <- readWideString pf2
let pf3 = addNCastPtr pf2 4
pAuthInfo <- readunique readCOAUTHINFO pf3
let pf4 = addNCastPtr pf3 4
dwReserved2 <- readWord32 pf4
return (COSERVERINFO dwReserved1 pwszName pAuthInfo dwReserved2)
sizeofCOSERVERINFO :: Word32
sizeofCOSERVERINFO = 16
data MULTI_QI_PRIM = MULTI_QI {pIID :: PGUID,
pItf :: (Ptr ()),
hr :: HRESULT}
writeMULTI_QI_PRIM :: Ptr MULTI_QI_PRIM
-> MULTI_QI_PRIM
-> IO ()
writeMULTI_QI_PRIM ptr (MULTI_QI pIID pItf hr) =
let
pf0 = ptr
pf1 = addNCastPtr pf0 0
in
do
writePtr pf1 pIID
let pf2 = addNCastPtr pf1 4
writePtr pf2 pItf
let pf3 = addNCastPtr pf2 4
writeInt32 pf3 hr
readMULTI_QI_PRIM :: Ptr MULTI_QI_PRIM
-> IO MULTI_QI_PRIM
readMULTI_QI_PRIM ptr =
let
pf0 = ptr
pf1 = addNCastPtr pf0 0
in
do
pIID <- readPtr pf1
let pf2 = addNCastPtr pf1 4
pItf <- readPtr pf2
let pf3 = addNCastPtr pf2 4
hr <- readInt32 pf3
return (MULTI_QI pIID pItf hr)
sizeofMULTI_QI_PRIM :: Word32
sizeofMULTI_QI_PRIM = 12
coCreateInstanceEx :: ForeignPtr ()
-> ForeignPtr ()
-> DWORD
-> Maybe COSERVERINFO
-> [MULTI_QI_PRIM]
-> IO [MULTI_QI_PRIM]
coCreateInstanceEx clsid pUnkOuter dwClsCtx pServerInfo pResults =
let
cmq = (fromIntegral (length pResults) :: Word32)
in
do
pResults <- marshalllist sizeofMULTI_QI_PRIM writeMULTI_QI_PRIM pResults
pServerInfo <- marshallunique (allocBytes (fromIntegral sizeofCOSERVERINFO)) writeCOSERVERINFO pServerInfo
o_coCreateInstanceEx <- withForeignPtr clsid (\ clsid -> withForeignPtr pUnkOuter (\ pUnkOuter -> prim_System_Win32_Com_Base_coCreateInstanceEx clsid pUnkOuter dwClsCtx pServerInfo cmq pResults))
free pServerInfo
checkHR o_coCreateInstanceEx
cmq <- unmarshallWord32 cmq
unmarshalllist sizeofMULTI_QI_PRIM 0 cmq readMULTI_QI_PRIM pResults
foreign import stdcall "CoCreateInstanceEx" prim_System_Win32_Com_Base_coCreateInstanceEx :: Ptr () -> Ptr () -> Word32 -> Ptr COSERVERINFO -> Word32 -> Ptr MULTI_QI_PRIM -> IO Int32
getActiveObject :: ForeignPtr ()
-> Ptr ()
-> Ptr ()
-> IO ()
getActiveObject clsid inner ppv =
do
o_getActiveObject <- withForeignPtr clsid (\ clsid -> prim_System_Win32_Com_Base_getActiveObject clsid inner ppv)
checkHR o_getActiveObject
foreign import stdcall "GetActiveObject" prim_System_Win32_Com_Base_getActiveObject :: Ptr () -> Ptr () -> Ptr () -> IO Int32
primQI :: Ptr ()
-> Ptr ()
-> ForeignPtr ()
-> Ptr (Ptr ())
-> IO ()
primQI methPtr iptr riid ppv =
do
o_primQI <- withForeignPtr riid (\ riid -> prim_System_Win32_Com_Base_primQI methPtr iptr riid ppv)
checkHR o_primQI
foreign import ccall "primQI" prim_System_Win32_Com_Base_primQI :: Ptr () -> Ptr () -> Ptr () -> Ptr (Ptr ()) -> IO Int32
primAddRef :: Ptr ()
-> Ptr ()
-> IO Word32
primAddRef methPtr iptr =
prim_System_Win32_Com_Base_primAddRef methPtr
iptr
foreign import ccall "primAddRef" prim_System_Win32_Com_Base_primAddRef :: Ptr () -> Ptr () -> IO Word32
primRelease :: Ptr ()
-> Ptr ()
-> IO Word32
primRelease methPtr iptr =
prim_System_Win32_Com_Base_primRelease methPtr
iptr
foreign import ccall "primRelease" prim_System_Win32_Com_Base_primRelease :: Ptr () -> Ptr () -> IO Word32
primEnumNext :: Ptr ()
-> Ptr ()
-> Word32
-> Ptr ()
-> Ptr ()
-> IO ()
primEnumNext methPtr iptr celt ptr po =
do
o_primEnumNext <- prim_System_Win32_Com_Base_primEnumNext methPtr iptr celt ptr po
checkHR o_primEnumNext
foreign import ccall "primEnumNext" prim_System_Win32_Com_Base_primEnumNext :: Ptr () -> Ptr () -> Word32 -> Ptr () -> Ptr () -> IO Int32
primEnumSkip :: Ptr ()
-> Ptr ()
-> Word32
-> IO ()
primEnumSkip methPtr iptr celt =
do
o_primEnumSkip <- prim_System_Win32_Com_Base_primEnumSkip methPtr iptr celt
checkHR o_primEnumSkip
foreign import ccall "primEnumSkip" prim_System_Win32_Com_Base_primEnumSkip :: Ptr () -> Ptr () -> Word32 -> IO Int32
primEnumReset :: Ptr ()
-> Ptr ()
-> IO ()
primEnumReset methPtr iptr =
do
o_primEnumReset <- prim_System_Win32_Com_Base_primEnumReset methPtr iptr
checkHR o_primEnumReset
foreign import ccall "primEnumReset" prim_System_Win32_Com_Base_primEnumReset :: Ptr () -> Ptr () -> IO Int32
primEnumClone :: Ptr ()
-> Ptr ()
-> Ptr ()
-> IO ()
primEnumClone methPtr iptr ppv =
do
o_primEnumClone <- prim_System_Win32_Com_Base_primEnumClone methPtr iptr ppv
checkHR o_primEnumClone
foreign import ccall "primEnumClone" prim_System_Win32_Com_Base_primEnumClone :: Ptr () -> Ptr () -> Ptr () -> IO Int32
primPersistLoad :: Ptr ()
-> Ptr ()
-> Ptr Wchar_t
-> Word32
-> IO ()
primPersistLoad methPtr iptr pszFileName dwMode =
do
o_primPersistLoad <- prim_System_Win32_Com_Base_primPersistLoad methPtr iptr pszFileName dwMode
checkHR o_primPersistLoad
foreign import ccall "primPersistLoad" prim_System_Win32_Com_Base_primPersistLoad :: Ptr () -> Ptr () -> Ptr Word16 -> Word32 -> IO Int32
primNullIID :: IO (Ptr ())
primNullIID = prim_System_Win32_Com_Base_primNullIID
foreign import ccall "primNullIID" prim_System_Win32_Com_Base_primNullIID :: IO (Ptr ())
loadTypeLib :: Ptr Wchar_t
-> Ptr ()
-> IO ()
loadTypeLib pfname ptr =
do
o_loadTypeLib <- prim_System_Win32_Com_Base_loadTypeLib pfname ptr
checkHR o_loadTypeLib
foreign import stdcall "LoadTypeLib" prim_System_Win32_Com_Base_loadTypeLib :: Ptr Word16 -> Ptr () -> IO Int32
loadTypeLibEx :: Ptr Wchar_t
-> Int32
-> Ptr ()
-> IO ()
loadTypeLibEx pfname rkind ptr =
do
o_loadTypeLibEx <- prim_System_Win32_Com_Base_loadTypeLibEx pfname rkind ptr
checkHR o_loadTypeLibEx
foreign import stdcall "LoadTypeLibEx" prim_System_Win32_Com_Base_loadTypeLibEx :: Ptr Word16 -> Int32 -> Ptr () -> IO Int32
loadRegTypeLib :: ForeignPtr ()
-> Int32
-> Int32
-> Int32
-> Ptr ()
-> IO ()
loadRegTypeLib pguid maj min lcid ptr =
do
o_loadRegTypeLib <- withForeignPtr pguid (\ pguid -> prim_System_Win32_Com_Base_loadRegTypeLib pguid maj min lcid ptr)
checkHR o_loadRegTypeLib
foreign import stdcall "LoadRegTypeLib" prim_System_Win32_Com_Base_loadRegTypeLib :: Ptr () -> Int32 -> Int32 -> Int32 -> Ptr () -> IO Int32
primQueryPathOfRegTypeLib :: ForeignPtr ()
-> Word16
-> Word16
-> IO (Ptr Wchar_t)
primQueryPathOfRegTypeLib pgd maj min =
withForeignPtr pgd
(\ pgd -> prim_System_Win32_Com_Base_primQueryPathOfRegTypeLib pgd maj min)
foreign import ccall "primQueryPathOfRegTypeLib" prim_System_Win32_Com_Base_primQueryPathOfRegTypeLib :: Ptr () -> Word16 -> Word16 -> IO (Ptr Word16)
addrOfReleaseIUnknown :: Ptr ()
addrOfReleaseIUnknown =
unsafePerformIO (prim_System_Win32_Com_Base_addrOfReleaseIUnknown)
foreign import ccall "addrOfReleaseIUnknown" prim_System_Win32_Com_Base_addrOfReleaseIUnknown :: IO (Ptr ())
bstrToStringLen :: Ptr String
-> Int32
-> Ptr Char
-> IO ()
bstrToStringLen bstr len str =
do
o_bstrToStringLen <- prim_System_Win32_Com_Base_bstrToStringLen bstr len str
checkHR o_bstrToStringLen
foreign import ccall "bstrToStringLen" prim_System_Win32_Com_Base_bstrToStringLen :: Ptr String -> Int32 -> Ptr Char -> IO Int32
bstrLen :: Ptr String
-> Int32
bstrLen bstr =
unsafePerformIO (prim_System_Win32_Com_Base_bstrLen bstr)
foreign import ccall "bstrLen" prim_System_Win32_Com_Base_bstrLen :: Ptr String -> IO Int32
stringToBSTR :: Ptr String
-> IO (Ptr String)
stringToBSTR bstr =
do
res <- allocBytes (fromIntegral sizeofPtr)
o_stringToBSTR <- prim_System_Win32_Com_Base_stringToBSTR bstr res
checkHR o_stringToBSTR
return (res)
foreign import ccall "stringToBSTR" prim_System_Win32_Com_Base_stringToBSTR :: Ptr String -> Ptr String -> IO Int32
getModuleFileName :: Ptr ()
-> IO String
getModuleFileName hModule =
do
o_getModuleFileName <- prim_System_Win32_Com_Base_getModuleFileName hModule
doThenFree free_malloc unmarshallString o_getModuleFileName
foreign import ccall "getModuleFileName" prim_System_Win32_Com_Base_getModuleFileName :: Ptr () -> IO (Ptr String)
messagePump :: IO ()
messagePump =
prim_System_Win32_Com_Base_messagePump
foreign import ccall "messagePump" prim_System_Win32_Com_Base_messagePump :: IO ()
postQuitMsg :: IO ()
postQuitMsg =
prim_System_Win32_Com_Base_postQuitMsg
foreign import ccall "postQuitMsg" prim_System_Win32_Com_Base_postQuitMsg :: IO ()
primOutputDebugString :: String
-> IO ()
primOutputDebugString msg =
do
msg <- marshallString msg
prim_System_Win32_Com_Base_primOutputDebugString msg
freeString msg
foreign import stdcall "OutputDebugStringA" prim_System_Win32_Com_Base_primOutputDebugString :: Ptr String -> IO ()
primGetVersionInfo :: IO (Word32, Word32, Word32)
primGetVersionInfo =
do
maj <- allocBytes (fromIntegral sizeofWord32)
min <- allocBytes (fromIntegral sizeofWord32)
pid <- allocBytes (fromIntegral sizeofWord32)
prim_System_Win32_Com_Base_primGetVersionInfo maj min pid
maj <- doThenFree free readWord32 maj
min <- doThenFree free readWord32 min
pid <- doThenFree free readWord32 pid
return (maj, min, pid)
foreign import ccall "primGetVersionInfo" prim_System_Win32_Com_Base_primGetVersionInfo :: Ptr Word32 -> Ptr Word32 -> Ptr Word32 -> IO ()
coRegisterClassObject :: ForeignPtr ()
-> ForeignPtr ()
-> Int32
-> Int32
-> IO Word32
coRegisterClassObject rclsid pUnk dwClsContext flags0 =
do
lpwRegister <- allocBytes (fromIntegral sizeofWord32)
o_coRegisterClassObject <- withForeignPtr rclsid (\ rclsid -> withForeignPtr pUnk (\ pUnk -> prim_System_Win32_Com_Base_coRegisterClassObject rclsid pUnk dwClsContext flags0 lpwRegister))
checkHR o_coRegisterClassObject
doThenFree free readWord32 lpwRegister
foreign import stdcall "CoRegisterClassObject" prim_System_Win32_Com_Base_coRegisterClassObject :: Ptr () -> Ptr () -> Int32 -> Int32 -> Ptr Word32 -> IO Int32