- USING: alien alien.syntax alien.c-types math kernel sequences\r
- windows windows.kernel32 windows.types combinators.lib ;\r
+ USING: alien alien.syntax alien.c-types alien.strings math\r
+ kernel sequences windows windows.types combinators.lib ;\r
IN: windows.ole32\r
\r
LIBRARY: ole32\r
\r
-C-STRUCT: GUID\r
- { "DWORD" "part1" }\r
- { "DWORD" "part2" }\r
- { "DWORD" "part3" }\r
- { "DWORD" "part4" } ;\r
-\r
-TYPEDEF: void* REFGUID\r
+TYPEDEF: GUID* REFGUID\r
TYPEDEF: void* LPUNKNOWN\r
- TYPEDEF: ushort* LPOLESTR\r
- TYPEDEF: ushort* LPCOLESTR\r
+ TYPEDEF: wchar_t* LPOLESTR\r
+ TYPEDEF: wchar_t* LPCOLESTR\r
\r
TYPEDEF: REFGUID REFIID\r
TYPEDEF: REFGUID REFCLSID\r
\r
: S_OK 0 ; inline\r
: S_FALSE 1 ; inline\r
+: E_NOINTERFACE HEX: 80004002 ; inline\r
: E_FAIL HEX: 80004005 ; inline\r
: E_INVALIDARG HEX: 80070057 ; inline\r
\r
: DD_DEFDRAGDELAY 200 ; inline\r
: DD_DEFDRAGMINDIST 2 ; inline\r
\r
-: ole32-error ( n -- )\r
- dup S_OK = [\r
+: CF_TEXT 1 ; inline\r
+: CF_BITMAP 2 ; inline\r
+: CF_METAFILEPICT 3 ; inline\r
+: CF_SYLK 4 ; inline\r
+: CF_DIF 5 ; inline\r
+: CF_TIFF 6 ; inline\r
+: CF_OEMTEXT 7 ; inline\r
+: CF_DIB 8 ; inline\r
+: CF_PALETTE 9 ; inline\r
+: CF_PENDATA 10 ; inline\r
+: CF_RIFF 11 ; inline\r
+: CF_WAVE 12 ; inline\r
+: CF_UNICODETEXT 13 ; inline\r
+: CF_ENHMETAFILE 14 ; inline\r
+: CF_HDROP 15 ; inline\r
+: CF_LOCALE 16 ; inline\r
+: CF_MAX 17 ; inline\r
+\r
+: CF_OWNERDISPLAY HEX: 0080 ; inline\r
+: CF_DSPTEXT HEX: 0081 ; inline\r
+: CF_DSPBITMAP HEX: 0082 ; inline\r
+: CF_DSPMETAFILEPICT HEX: 0083 ; inline\r
+: CF_DSPENHMETAFILE HEX: 008E ; inline\r
+\r
+: DVASPECT_CONTENT 1 ; inline\r
+: DVASPECT_THUMBNAIL 2 ; inline\r
+: DVASPECT_ICON 4 ; inline\r
+: DVASPECT_DOCPRINT 8 ; inline\r
+\r
+: TYMED_HGLOBAL 1 ; inline\r
+: TYMED_FILE 2 ; inline\r
+: TYMED_ISTREAM 4 ; inline\r
+: TYMED_ISTORAGE 8 ; inline\r
+: TYMED_GDI 16 ; inline\r
+: TYMED_MFPICT 32 ; inline\r
+: TYMED_ENHMF 64 ; inline\r
+: TYMED_NULL 0 ; inline\r
+\r
+C-STRUCT: DVTARGETDEVICE\r
+ { "DWORD" "tdSize" }\r
+ { "WORD" "tdDriverNameOffset" }\r
+ { "WORD" "tdDeviceNameOffset" }\r
+ { "WORD" "tdPortNameOffset" }\r
+ { "WORD" "tdExtDevmodeOffset" }\r
+ { "BYTE[1]" "tdData" } ;\r
+\r
+TYPEDEF: WORD CLIPFORMAT\r
+TYPEDEF: POINT POINTL\r
+\r
+C-STRUCT: FORMATETC\r
+ { "CLIPFORMAT" "cfFormat" }\r
+ { "DVTARGETDEVICE*" "ptd" }\r
+ { "DWORD" "dwAspect" }\r
+ { "LONG" "lindex" }\r
+ { "DWORD" "tymed" } ;\r
+TYPEDEF: FORMATETC* LPFORMATETC\r
+\r
+C-STRUCT: STGMEDIUM\r
+ { "DWORD" "tymed" }\r
+ { "void*" "data" }\r
+ { "LPUNKNOWN" "punkForRelease" } ;\r
+TYPEDEF: STGMEDIUM* LPSTGMEDIUM\r
+\r
+: COINIT_MULTITHREADED 0 ; inline\r
+: COINIT_APARTMENTTHREADED 2 ; inline\r
+: COINIT_DISABLE_OLE1DDE 4 ; inline\r
+: COINIT_SPEED_OVER_MEMORY 8 ; inline\r
+\r
+FUNCTION: HRESULT OleInitialize ( void* reserved ) ;\r
+FUNCTION: HRESULT CoInitializeEx ( void* reserved, DWORD dwCoInit ) ;\r
+\r
+FUNCTION: HRESULT RegisterDragDrop ( HWND hWnd, IDropTarget* pDropTarget ) ;\r
+FUNCTION: HRESULT RevokeDragDrop ( HWND hWnd ) ;\r
+FUNCTION: void ReleaseStgMedium ( LPSTGMEDIUM pmedium ) ;\r
+\r
+: succeeded? ( hresult -- ? )\r
+ 0 HEX: 7FFFFFFF between? ;\r
+\r
+: ole32-error ( hresult -- )\r
+ dup succeeded? [\r
drop\r
] [ (win32-error-string) throw ] if ;\r
\r
+: ole-initialize ( -- )\r
+ f OleInitialize ole32-error ;\r
+\r
: guid= ( a b -- ? )\r
IsEqualGUID c-bool> ;\r
\r
"{01234567-89ab-cdef-0123-456789abcdef}" length ; inline\r
\r
: string>guid ( string -- guid )\r
- string>u16-alien "GUID" <c-object> [ CLSIDFromString ole32-error ] keep ;\r
+ utf16n string>alien "GUID" <c-object> [ CLSIDFromString ole32-error ] keep ;\r
: guid>string ( guid -- string )\r
GUID-STRING-LENGTH 1+ [ "ushort" <c-array> ] keep\r
- [ StringFromGUID2 drop ] { 2 } multikeep alien>u16-string ;\r
+ [ StringFromGUID2 drop ] { 2 } multikeep utf16n alien>string ;\r
\r
- USING: alien alien.c-types alien.syntax combinators
+ USING: alien alien.c-types alien.strings alien.syntax combinators
kernel windows windows.user32 windows.ole32
- windows.com windows.com.syntax ;
+ windows.com windows.com.syntax io.files ;
IN: windows.shell32
: CSIDL_DESKTOP HEX: 00 ; inline
: ShellExecute ShellExecuteW ; inline
: open-in-explorer ( dir -- )
- f "open" rot f f SW_SHOWNORMAL ShellExecute drop ;
+ f "open" rot (normalize-path) f f SW_SHOWNORMAL ShellExecute drop ;
: shell32-error ( n -- )
ole32-error ; inline
: shell32-directory ( n -- str )
f swap f SHGFP_TYPE_DEFAULT
MAX_UNICODE_PATH "ushort" <c-array>
- [ SHGetFolderPath shell32-error ] keep alien>u16-string ;
+ [ SHGetFolderPath shell32-error ] keep utf16n alien>string ;
: desktop ( -- str )
CSIDL_DESKTOPDIRECTORY shell32-directory ;
TYPEDEF: ULONG SFGAOF
+C-STRUCT: DROPFILES
+ { "DWORD" "pFiles" }
+ { "POINT" "pt" }
+ { "BOOL" "fNC" }
+ { "BOOL" "fWide" } ;
+TYPEDEF: DROPFILES* LPDROPFILES
+TYPEDEF: DROPFILES* LPCDROPFILES
+TYPEDEF: HANDLE HDROP
+
C-STRUCT: SHITEMID
{ "USHORT" "cb" }
{ "BYTE[1]" "abID" } ;
FUNCTION: HRESULT SHGetDesktopFolder ( IShellFolder** ppshf ) ;
-FUNCTION: HRESULT StrRetToBufW ( STRRET *pstr, PCUITEMID_CHILD pidl, LPWSTR pszBuf, UINT cchBuf ) ;
-: StrRetToBuf StrRetToBufW ; inline
+FUNCTION: UINT DragQueryFileW ( HDROP hDrop, UINT iFile, LPWSTR lpszFile, UINT cch ) ;
+: DragQueryFile DragQueryFileW ; inline
+