Safe Haskell | None |
---|---|
Language | Haskell2010 |
Working with .lnk
format should be a matter of serializing.
This library takes simpler approach, utilizing Component Object Model
(COM
) library. Even though COM
provides some means of serialization,
they cannot be used in a pure fashion - the library needs
to be initialized and some COM
functions still query the
system for data. For this reason this library sticks to IO
.
Before calling writeShortcut
or readShortcut
, COM
library
must be initialized with initialize
.
Library does not support shortcut's IDList
s, so creating or
reading links to devices or network connections is not possible.
Example
import Control.Monad.Except main = print . runExceptT $ do let link = empty { targetPath = "notepad.exe" } ExceptT initialize ExceptT $ writeShortcut link "c:\\link.lnk" ret <- ExceptT $ readShortcut "c:\\link.lnk" liftIO $ uninitialize return ret
>>> main Right (Shortcut {targetPath = "C:\\Windows\\system32\\notepad.exe", arguments = "", workingDirectory = "", showCmd = ShowNormal, description = "", iconLocation = ("",0), hotkey = 0})
- data Shortcut = Shortcut {
- targetPath :: FilePath
- arguments :: String
- workingDirectory :: FilePath
- showCmd :: ShowCmd
- description :: String
- iconLocation :: (FilePath, Int)
- hotkey :: WORD
- empty :: Shortcut
- data ShowCmd
- writeShortcut :: Shortcut -> FilePath -> IO (Either ShortcutError ())
- unsafeWriteShortcut :: Shortcut -> FilePath -> IO (Either ShortcutError ())
- readShortcut :: FilePath -> IO (Either ShortcutError Shortcut)
- initialize :: IO (Either ShortcutError ())
- uninitialize :: IO ()
- data ShortcutError
- = InitializationError (OrHRESULTError CoInitializeError)
- | CreateIShellLinkInterfaceError (OrHRESULTError CoCreateInstanceError)
- | CreateIPersistFileInterfaceError (OrHRESULTError CoCreateInstanceError)
- | LoadError (OrHRESULTError LoadError)
- | SaveError (OrHRESULTError SaveError)
- | InvalidPath (OrHRESULTError PathError)
- | InvalidArguments (OrHRESULTError ArgumentsError)
- | InvalidWorkingDirectory (OrHRESULTError WorkingDirectoryError)
- | InvalidDescription (OrHRESULTError DescriptionError)
- | InvalidIconLocation (OrHRESULTError IconLocationError)
- | InvalidHotkey HRESULTError
- | InvalidShowCmd HRESULTError
- data LoadError
- data SaveError = SE_S_FALSE
- data PathError
- data ArgumentsError = ArgumentsTooLong
- data WorkingDirectoryError = WorkingDirectoryTooLong
- data DescriptionError = DescriptionTooLong
- data IconLocationError = IconLocationTooLong
- data CoCreateInstanceError
- data CoInitializeError
- data HRESULTError
- data OrHRESULTError err
- = OtherError err
- | HRESULTError HRESULTError
Documentation
A shell link.
It seems that .lnk
format permits up to 32767
characters in text fields (259 for targetPath
), however
if workingDirectory
, description
or iconLocation
is
longer then 259 characters COM
won't be able to read the
shortcut corectly (readShortcut
will return faulty link without
raising any error, and explorer.exe
may not interpret it properly).
For this reason two write functions are provided. unsafeWriteShortcut
will allow long fields and writeShortcut
which will raise
error if workingDirectory
, description
or iconLocation
is longer then 259 characters.
Shortcut | |
|
Defines how a window will be opened when a link is executed.
ShowNormal | Start normally. |
ShowMaximized | Start maximized. |
ShowMinimized | Start minimized. |
Basic operations
writeShortcut :: Shortcut -> FilePath -> IO (Either ShortcutError ()) Source #
Create a shortcut under specified location. initialize
must be
called beforehand. targetPath
will be resolved with
respect to whatever is found in PATH
variable or desktop
if saved path is not absolute.
unsafeWriteShortcut :: Shortcut -> FilePath -> IO (Either ShortcutError ()) Source #
Same as writeShortcut
, but allows long description
,
workingDirectory
and iconLocation
fields. COM
and explorer.exe
may not interpret created link correctly.
readShortcut :: FilePath -> IO (Either ShortcutError Shortcut) Source #
Read a shortcut from the supplied location. initialize
must be
called beforehand.
COM initialization
initialize :: IO (Either ShortcutError ()) Source #
Initialize COM
library for current thread.
Wraps CoInitializeEx
function.
uninitialize :: IO () Source #
Uninitialize COM
library for current thread.
Errors
data ShortcutError Source #
Catch-all type for errors.
File IO Errors
IPersistFile
interface failed to load a file.
LE_E_OUTOFMEMORY | The object could not be loaded due to a lack of memory. |
LE_E_FAIL | The object could not be loaded for some reason other than a lack of memory. |
IPersistFile
interface failed to save a file.
SE_S_FALSE | The object was not successfully saved. |
Argument errors
Path_S_FALSE | The operation is successful but no path is retrieved. |
PathTooLong | Path length >= 260 characters. |
data ArgumentsError Source #
ArgumentsTooLong | Arguments length >= 32768 characters. |
Other errors
data CoCreateInstanceError Source #
COM
cannot create specified interface.
CCI_REGDB_E_CLASSNOTREG | A specified class is not registered in the registration database. Also can indicate that the type of server you requested in the CLSCTX enumeration is not registered or the values for the server types in the registry are corrupt. |
CCI_CLASS_E_NOAGGREGATION | This class cannot be created as part of an aggregate. |
CCI_E_NOINTERFACE | The specified class does not implement the requested interface, or the controlling IUnknown does not expose the requested interface. |
CCI_E_POINTER | The ppv parameter is NULL. |
CCI_CO_E_NOTINITIALIZED |
|
data CoInitializeError Source #
COM
failed to initialize.
CI_RPC_E_CHANGED_MODE | A previous call to CoInitializeEx specified the concurrency model for this thread as multithread apartment (MTA). This could also indicate that a change from neutral-threaded apartment to single-threaded apartment has occurred. |
CI_CO_E_NOTINITIALIZED | You need to initialize the |
data HRESULTError Source #
In Win32 API
HRESULT
is used to indicate error and warning
conditions. HRESULTError
wraps HRESULT
to give it some meaning.
E_ABORT | Operation aborted. |
E_ACCESSDENIED | General access denied error. |
E_FAIL | Unspecified failure. |
E_HANDLE | Handle that is not valid. |
E_INVALIDARG | One or more arguments are not valid. |
E_NOINTERFACE | No such interface supported. |
E_NOTIMPL | Not implemented. |
E_OUTOFMEMORY | Failed to allocate necessary memory. |
E_POINTER | Pointer that is not valid. |
E_UNEXPECTED | Unexpected failure. |
HRESULTUnknown HRESULT | Other, unknown |
data OrHRESULTError err Source #
Some error that comes from HRESULT
.
OtherError err |
|
HRESULTError HRESULTError |
|
Show err => Show (OrHRESULTError err) Source # | |