4 * Copyright 1998 Marcus Meissner
5 * Copyright 1998 Juergen Schmied (jsch) * <juergen.schmied@metronet.de>
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
43 #include "undocshell.h"
45 #include "shell32_main.h"
49 #include "wine/debug.h"
50 #include "wine/unicode.h"
52 WINE_DEFAULT_DEBUG_CHANNEL(shell
);
54 extern const char * const SHELL_Authors
[];
57 /*************************************************************************
58 * CommandLineToArgvW [SHELL32.@]
60 * We must interpret the quotes in the command line to rebuild the argv
62 * - arguments are separated by spaces or tabs
63 * - quotes serve as optional argument delimiters
65 * - escaped quotes must be converted back to '"'
67 * - an odd number of '\'s followed by '"' correspond to half that number
68 * of '\' followed by a '"' (extension of the above)
71 * - an even number of '\'s followed by a '"' correspond to half that number
72 * of '\', plus a regular quote serving as an argument delimiter (which
73 * means it does not appear in the result)
74 * 'a\\"b c"' -> 'a\b c'
75 * 'a\\\\"b c"' -> 'a\\b c'
76 * - '\' that are not followed by a '"' are copied literally
86 LPWSTR
* WINAPI
CommandLineToArgvW(LPCWSTR lpCmdline
, int* numargs
)
98 /* Return the path to the executable */
101 hargv
=GlobalAlloc(size
, 0);
102 argv
=GlobalLock(hargv
);
105 len
= GetModuleFileNameW(0, (LPWSTR
)(argv
+1), size
-sizeof(LPWSTR
));
111 if (len
< size
) break;
113 hargv
=GlobalReAlloc(hargv
, size
, 0);
114 argv
=GlobalLock(hargv
);
116 argv
[0]=(LPWSTR
)(argv
+1);
123 /* to get a writeable copy */
130 if (*cs
==0 || ((*cs
==0x0009 || *cs
==0x0020) && !in_quotes
))
134 /* skip the remaining spaces */
135 while (*cs
==0x0009 || *cs
==0x0020) {
143 else if (*cs
==0x005c)
145 /* '\', count them */
148 else if ((*cs
==0x0022) && ((bcount
& 1)==0))
151 in_quotes
=!in_quotes
;
156 /* a regular character */
161 /* Allocate in a single lump, the string array, and the strings that go with it.
162 * This way the caller can make a single GlobalFree call to free both, as per MSDN.
164 hargv
=GlobalAlloc(0, argc
*sizeof(LPWSTR
)+(strlenW(lpCmdline
)+1)*sizeof(WCHAR
));
165 argv
=GlobalLock(hargv
);
168 cmdline
=(LPWSTR
)(argv
+argc
);
169 strcpyW(cmdline
, lpCmdline
);
177 if ((*s
==0x0009 || *s
==0x0020) && !in_quotes
)
179 /* Close the argument and copy it */
183 /* skip the remaining spaces */
186 } while (*s
==0x0009 || *s
==0x0020);
188 /* Start with a new argument */
203 /* Preceded by an even number of '\', this is half that
204 * number of '\', plus a quote which we erase.
207 in_quotes
=!in_quotes
;
212 /* Preceded by an odd number of '\', this is half that
213 * number of '\' followed by a '"'
223 /* a regular character */
239 static DWORD
shgfi_get_exe_type(LPCWSTR szFullPath
)
244 IMAGE_DOS_HEADER mz_header
;
249 status
= GetBinaryTypeW (szFullPath
, &BinaryType
);
252 if (BinaryType
== SCS_DOS_BINARY
|| BinaryType
== SCS_PIF_BINARY
)
255 hfile
= CreateFileW( szFullPath
, GENERIC_READ
, FILE_SHARE_READ
,
256 NULL
, OPEN_EXISTING
, 0, 0 );
257 if ( hfile
== INVALID_HANDLE_VALUE
)
261 * The next section is adapted from MODULE_GetBinaryType, as we need
262 * to examine the image header to get OS and version information. We
263 * know from calling GetBinaryTypeA that the image is valid and either
264 * an NE or PE, so much error handling can be omitted.
265 * Seek to the start of the file and read the header information.
268 SetFilePointer( hfile
, 0, NULL
, SEEK_SET
);
269 ReadFile( hfile
, &mz_header
, sizeof(mz_header
), &len
, NULL
);
271 SetFilePointer( hfile
, mz_header
.e_lfanew
, NULL
, SEEK_SET
);
272 ReadFile( hfile
, magic
, sizeof(magic
), &len
, NULL
);
273 if ( *(DWORD
*)magic
== IMAGE_NT_SIGNATURE
)
275 SetFilePointer( hfile
, mz_header
.e_lfanew
, NULL
, SEEK_SET
);
276 ReadFile( hfile
, &nt
, sizeof(nt
), &len
, NULL
);
277 CloseHandle( hfile
);
278 if (nt
.OptionalHeader
.Subsystem
== IMAGE_SUBSYSTEM_WINDOWS_GUI
)
280 return IMAGE_NT_SIGNATURE
|
281 (nt
.OptionalHeader
.MajorSubsystemVersion
<< 24) |
282 (nt
.OptionalHeader
.MinorSubsystemVersion
<< 16);
284 return IMAGE_NT_SIGNATURE
;
286 else if ( *(WORD
*)magic
== IMAGE_OS2_SIGNATURE
)
289 SetFilePointer( hfile
, mz_header
.e_lfanew
, NULL
, SEEK_SET
);
290 ReadFile( hfile
, &ne
, sizeof(ne
), &len
, NULL
);
291 CloseHandle( hfile
);
292 if (ne
.ne_exetyp
== 2)
293 return IMAGE_OS2_SIGNATURE
| (ne
.ne_expver
<< 16);
296 CloseHandle( hfile
);
300 #define SHGFI_KNOWN_FLAGS \
301 (SHGFI_SMALLICON | SHGFI_OPENICON | SHGFI_SHELLICONSIZE | SHGFI_PIDL | \
302 SHGFI_USEFILEATTRIBUTES | SHGFI_ADDOVERLAYS | SHGFI_OVERLAYINDEX | \
303 SHGFI_ICON | SHGFI_DISPLAYNAME | SHGFI_TYPENAME | SHGFI_ATTRIBUTES | \
304 SHGFI_ICONLOCATION | SHGFI_EXETYPE | SHGFI_SYSICONINDEX | \
305 SHGFI_LINKOVERLAY | SHGFI_SELECTED | SHGFI_ATTR_SPECIFIED)
307 /*************************************************************************
308 * SHGetFileInfoW [SHELL32.@]
311 DWORD_PTR WINAPI
SHGetFileInfoW(LPCWSTR path
,DWORD dwFileAttributes
,
312 SHFILEINFOW
*psfi
, UINT sizeofpsfi
, UINT flags
)
314 WCHAR szLocation
[MAX_PATH
], szFullPath
[MAX_PATH
];
316 DWORD_PTR ret
= TRUE
;
317 DWORD dwAttributes
= 0;
318 IShellFolder
* psfParent
= NULL
;
319 IExtractIconW
* pei
= NULL
;
320 LPITEMIDLIST pidlLast
= NULL
, pidl
= NULL
;
322 BOOL IconNotYetLoaded
=TRUE
;
324 TRACE("%s fattr=0x%lx sfi=%p(attr=0x%08lx) size=0x%x flags=0x%x\n",
325 (flags
& SHGFI_PIDL
)? "pidl" : debugstr_w(path
), dwFileAttributes
,
326 psfi
, psfi
->dwAttributes
, sizeofpsfi
, flags
);
328 if ( (flags
& SHGFI_USEFILEATTRIBUTES
) &&
329 (flags
& (SHGFI_ATTRIBUTES
|SHGFI_EXETYPE
|SHGFI_PIDL
)))
332 /* windows initializes this values regardless of the flags */
335 psfi
->szDisplayName
[0] = '\0';
336 psfi
->szTypeName
[0] = '\0';
340 if (!(flags
& SHGFI_PIDL
))
342 /* SHGetFileInfo should work with absolute and relative paths */
343 if (PathIsRelativeW(path
))
345 GetCurrentDirectoryW(MAX_PATH
, szLocation
);
346 PathCombineW(szFullPath
, szLocation
, path
);
350 lstrcpynW(szFullPath
, path
, MAX_PATH
);
354 if (flags
& SHGFI_EXETYPE
)
356 if (flags
!= SHGFI_EXETYPE
)
358 return shgfi_get_exe_type(szFullPath
);
362 * psfi is NULL normally to query EXE type. If it is NULL, none of the
363 * below makes sense anyway. Windows allows this and just returns FALSE
369 * translate the path into a pidl only when SHGFI_USEFILEATTRIBUTES
371 * The pidl functions fail on not existing file names
374 if (flags
& SHGFI_PIDL
)
376 pidl
= ILClone((LPCITEMIDLIST
)path
);
378 else if (!(flags
& SHGFI_USEFILEATTRIBUTES
))
380 hr
= SHILCreateFromPathW(szFullPath
, &pidl
, &dwAttributes
);
383 if ((flags
& SHGFI_PIDL
) || !(flags
& SHGFI_USEFILEATTRIBUTES
))
385 /* get the parent shellfolder */
388 hr
= SHBindToParent( pidl
, &IID_IShellFolder
, (LPVOID
*)&psfParent
,
389 (LPCITEMIDLIST
*)&pidlLast
);
391 pidlLast
= ILClone(pidlLast
);
396 ERR("pidl is null!\n");
401 /* get the attributes of the child */
402 if (SUCCEEDED(hr
) && (flags
& SHGFI_ATTRIBUTES
))
404 if (!(flags
& SHGFI_ATTR_SPECIFIED
))
406 psfi
->dwAttributes
= 0xffffffff;
408 IShellFolder_GetAttributesOf( psfParent
, 1, (LPCITEMIDLIST
*)&pidlLast
,
409 &(psfi
->dwAttributes
) );
412 /* get the displayname */
413 if (SUCCEEDED(hr
) && (flags
& SHGFI_DISPLAYNAME
))
415 if (flags
& SHGFI_USEFILEATTRIBUTES
)
417 lstrcpyW (psfi
->szDisplayName
, PathFindFileNameW(szFullPath
));
422 hr
= IShellFolder_GetDisplayNameOf( psfParent
, pidlLast
,
423 SHGDN_INFOLDER
, &str
);
424 StrRetToStrNW (psfi
->szDisplayName
, MAX_PATH
, &str
, pidlLast
);
428 /* get the type name */
429 if (SUCCEEDED(hr
) && (flags
& SHGFI_TYPENAME
))
431 static const WCHAR szFile
[] = { 'F','i','l','e',0 };
432 static const WCHAR szDashFile
[] = { '-','f','i','l','e',0 };
434 if (!(flags
& SHGFI_USEFILEATTRIBUTES
))
438 _ILGetFileType(pidlLast
, ftype
, 80);
439 MultiByteToWideChar(CP_ACP
, 0, ftype
, -1, psfi
->szTypeName
, 80 );
443 if (dwFileAttributes
& FILE_ATTRIBUTE_DIRECTORY
)
444 strcatW (psfi
->szTypeName
, szFile
);
449 lstrcpyW(sTemp
,PathFindExtensionW(szFullPath
));
450 if (!( HCR_MapTypeToValueW(sTemp
, sTemp
, 64, TRUE
) &&
451 HCR_MapTypeToValueW(sTemp
, psfi
->szTypeName
, 80, FALSE
)))
453 lstrcpynW (psfi
->szTypeName
, sTemp
, 64);
454 strcatW (psfi
->szTypeName
, szDashFile
);
461 if (flags
& SHGFI_ADDOVERLAYS
)
462 FIXME("SHGFI_ADDOVERLAYS unhandled\n");
464 if (flags
& SHGFI_OVERLAYINDEX
)
465 FIXME("SHGFI_OVERLAYINDEX unhandled\n");
467 if (flags
& SHGFI_LINKOVERLAY
)
468 FIXME("set icon to link, stub\n");
470 if (flags
& SHGFI_SELECTED
)
471 FIXME("set icon to selected, stub\n");
473 if (flags
& SHGFI_SHELLICONSIZE
)
474 FIXME("set icon to shell size, stub\n");
476 /* get the iconlocation */
477 if (SUCCEEDED(hr
) && (flags
& SHGFI_ICONLOCATION
))
481 hr
= IShellFolder_GetUIObjectOf(psfParent
, 0, 1,
482 (LPCITEMIDLIST
*)&pidlLast
, &IID_IExtractIconA
,
483 &uDummy
, (LPVOID
*)&pei
);
486 hr
= IExtractIconW_GetIconLocation(pei
,
487 (flags
& SHGFI_OPENICON
)? GIL_OPENICON
: 0,
488 szLocation
, MAX_PATH
, &iIndex
, &uFlags
);
489 psfi
->iIcon
= iIndex
;
491 if (uFlags
!= GIL_NOTFILENAME
)
492 lstrcpyW (psfi
->szDisplayName
, szLocation
);
496 IExtractIconA_Release(pei
);
500 /* get icon index (or load icon)*/
501 if (SUCCEEDED(hr
) && (flags
& (SHGFI_ICON
| SHGFI_SYSICONINDEX
)))
503 if (flags
& SHGFI_USEFILEATTRIBUTES
)
505 WCHAR sTemp
[MAX_PATH
];
509 lstrcpynW(sTemp
, szFullPath
, MAX_PATH
);
511 if (dwFileAttributes
& FILE_ATTRIBUTE_DIRECTORY
)
512 psfi
->iIcon
= SIC_GetIconIndex(swShell32Name
, -IDI_SHELL_FOLDER
, 0);
515 static const WCHAR p1W
[] = {'%','1',0};
518 szExt
= (LPWSTR
) PathFindExtensionW(sTemp
);
520 HCR_MapTypeToValueW(szExt
, sTemp
, MAX_PATH
, TRUE
) &&
521 HCR_GetDefaultIconW(sTemp
, sTemp
, MAX_PATH
, &dwNr
))
523 if (!lstrcmpW(p1W
,sTemp
)) /* icon is in the file */
524 strcpyW(sTemp
, szFullPath
);
526 if (flags
& SHGFI_SYSICONINDEX
)
528 psfi
->iIcon
= SIC_GetIconIndex(sTemp
,dwNr
,0);
529 if (psfi
->iIcon
== -1)
534 IconNotYetLoaded
=FALSE
;
535 if (flags
& SHGFI_SMALLICON
)
536 PrivateExtractIconsW( sTemp
,dwNr
,
537 GetSystemMetrics( SM_CXSMICON
),
538 GetSystemMetrics( SM_CYSMICON
),
539 &psfi
->hIcon
, 0, 1, 0);
541 PrivateExtractIconsW( sTemp
, dwNr
,
542 GetSystemMetrics( SM_CXICON
),
543 GetSystemMetrics( SM_CYICON
),
544 &psfi
->hIcon
, 0, 1, 0);
552 if (!(PidlToSicIndex(psfParent
, pidlLast
, !(flags
& SHGFI_SMALLICON
),
553 (flags
& SHGFI_OPENICON
)? GIL_OPENICON
: 0, &(psfi
->iIcon
))))
560 if (flags
& SHGFI_SMALLICON
)
561 ret
= (DWORD_PTR
) ShellSmallIconList
;
563 ret
= (DWORD_PTR
) ShellBigIconList
;
568 if (SUCCEEDED(hr
) && (flags
& SHGFI_ICON
) && IconNotYetLoaded
)
570 if (flags
& SHGFI_SMALLICON
)
571 psfi
->hIcon
= ImageList_GetIcon( ShellSmallIconList
, psfi
->iIcon
, ILD_NORMAL
);
573 psfi
->hIcon
= ImageList_GetIcon( ShellBigIconList
, psfi
->iIcon
, ILD_NORMAL
);
576 if (flags
& ~SHGFI_KNOWN_FLAGS
)
577 FIXME("unknown flags %08x\n", flags
& ~SHGFI_KNOWN_FLAGS
);
580 IShellFolder_Release(psfParent
);
589 TRACE ("icon=%p index=0x%08x attr=0x%08lx name=%s type=%s ret=0x%08lx\n",
590 psfi
->hIcon
, psfi
->iIcon
, psfi
->dwAttributes
,
591 debugstr_w(psfi
->szDisplayName
), debugstr_w(psfi
->szTypeName
), ret
);
597 /*************************************************************************
598 * SHGetFileInfoA [SHELL32.@]
600 DWORD_PTR WINAPI
SHGetFileInfoA(LPCSTR path
,DWORD dwFileAttributes
,
601 SHFILEINFOA
*psfi
, UINT sizeofpsfi
,
607 SHFILEINFOW temppsfi
;
609 if (flags
& SHGFI_PIDL
)
611 /* path contains a pidl */
612 temppath
= (LPWSTR
) path
;
616 len
= MultiByteToWideChar(CP_ACP
, 0, path
, -1, NULL
, 0);
617 temppath
= HeapAlloc(GetProcessHeap(), 0, len
*sizeof(WCHAR
));
618 MultiByteToWideChar(CP_ACP
, 0, path
, -1, temppath
, len
);
621 if (psfi
&& (flags
& SHGFI_ATTR_SPECIFIED
))
622 temppsfi
.dwAttributes
=psfi
->dwAttributes
;
625 ret
= SHGetFileInfoW(temppath
, dwFileAttributes
, NULL
, sizeof(temppsfi
), flags
);
627 ret
= SHGetFileInfoW(temppath
, dwFileAttributes
, &temppsfi
, sizeof(temppsfi
), flags
);
631 if(flags
& SHGFI_ICON
)
632 psfi
->hIcon
=temppsfi
.hIcon
;
633 if(flags
& (SHGFI_SYSICONINDEX
|SHGFI_ICON
|SHGFI_ICONLOCATION
))
634 psfi
->iIcon
=temppsfi
.iIcon
;
635 if(flags
& SHGFI_ATTRIBUTES
)
636 psfi
->dwAttributes
=temppsfi
.dwAttributes
;
637 if(flags
& (SHGFI_DISPLAYNAME
|SHGFI_ICONLOCATION
))
639 WideCharToMultiByte(CP_ACP
, 0, temppsfi
.szDisplayName
, -1,
640 psfi
->szDisplayName
, sizeof(psfi
->szDisplayName
), NULL
, NULL
);
642 if(flags
& SHGFI_TYPENAME
)
644 WideCharToMultiByte(CP_ACP
, 0, temppsfi
.szTypeName
, -1,
645 psfi
->szTypeName
, sizeof(psfi
->szTypeName
), NULL
, NULL
);
649 if (!(flags
& SHGFI_PIDL
))
650 HeapFree(GetProcessHeap(), 0, temppath
);
655 /*************************************************************************
656 * DuplicateIcon [SHELL32.@]
658 HICON WINAPI
DuplicateIcon( HINSTANCE hInstance
, HICON hIcon
)
663 TRACE("%p %p\n", hInstance
, hIcon
);
665 if (GetIconInfo(hIcon
, &IconInfo
))
667 hDupIcon
= CreateIconIndirect(&IconInfo
);
669 /* clean up hbmMask and hbmColor */
670 DeleteObject(IconInfo
.hbmMask
);
671 DeleteObject(IconInfo
.hbmColor
);
677 /*************************************************************************
678 * ExtractIconA [SHELL32.@]
680 HICON WINAPI
ExtractIconA(HINSTANCE hInstance
, LPCSTR lpszFile
, UINT nIconIndex
)
683 INT len
= MultiByteToWideChar(CP_ACP
, 0, lpszFile
, -1, NULL
, 0);
684 LPWSTR lpwstrFile
= HeapAlloc(GetProcessHeap(), 0, len
* sizeof(WCHAR
));
686 TRACE("%p %s %d\n", hInstance
, lpszFile
, nIconIndex
);
688 MultiByteToWideChar(CP_ACP
, 0, lpszFile
, -1, lpwstrFile
, len
);
689 ret
= ExtractIconW(hInstance
, lpwstrFile
, nIconIndex
);
690 HeapFree(GetProcessHeap(), 0, lpwstrFile
);
695 /*************************************************************************
696 * ExtractIconW [SHELL32.@]
698 HICON WINAPI
ExtractIconW(HINSTANCE hInstance
, LPCWSTR lpszFile
, UINT nIconIndex
)
702 UINT cx
= GetSystemMetrics(SM_CXICON
), cy
= GetSystemMetrics(SM_CYICON
);
704 TRACE("%p %s %d\n", hInstance
, debugstr_w(lpszFile
), nIconIndex
);
706 if (nIconIndex
== 0xFFFFFFFF)
708 ret
= PrivateExtractIconsW(lpszFile
, 0, cx
, cy
, NULL
, NULL
, 0, LR_DEFAULTCOLOR
);
709 if (ret
!= 0xFFFFFFFF && ret
)
710 return (HICON
)(UINT_PTR
)ret
;
714 ret
= PrivateExtractIconsW(lpszFile
, nIconIndex
, cx
, cy
, &hIcon
, NULL
, 1, LR_DEFAULTCOLOR
);
716 if (ret
== 0xFFFFFFFF)
718 else if (ret
> 0 && hIcon
)
724 /*************************************************************************
725 * Printer_LoadIconsW [SHELL32.205]
727 VOID WINAPI
Printer_LoadIconsW(LPCWSTR wsPrinterName
, HICON
* pLargeIcon
, HICON
* pSmallIcon
)
729 INT iconindex
=IDI_SHELL_PRINTER
;
731 TRACE("(%s, %p, %p)\n", debugstr_w(wsPrinterName
), pLargeIcon
, pSmallIcon
);
733 /* We should check if wsPrinterName is
734 1. the Default Printer or not
736 3. a Local Printer or a Network-Printer
737 and use different Icons
739 if((wsPrinterName
!= NULL
) && (wsPrinterName
[0] != 0))
741 FIXME("(select Icon by PrinterName %s not implemented)\n", debugstr_w(wsPrinterName
));
744 if(pLargeIcon
!= NULL
)
745 *pLargeIcon
= LoadImageW(shell32_hInstance
,
746 (LPCWSTR
) MAKEINTRESOURCE(iconindex
), IMAGE_ICON
,
747 0, 0, LR_DEFAULTCOLOR
|LR_DEFAULTSIZE
);
749 if(pSmallIcon
!= NULL
)
750 *pSmallIcon
= LoadImageW(shell32_hInstance
,
751 (LPCWSTR
) MAKEINTRESOURCE(iconindex
), IMAGE_ICON
,
752 16, 16, LR_DEFAULTCOLOR
);
755 /*************************************************************************
756 * Printers_RegisterWindowW [SHELL32.213]
757 * used by "printui.dll":
758 * find the Window of the given Type for the specific Printer and
759 * return the already existent hwnd or open a new window
761 BOOL WINAPI
Printers_RegisterWindowW(LPCWSTR wsPrinter
, DWORD dwType
,
762 HANDLE
* phClassPidl
, HWND
* phwnd
)
764 FIXME("(%s, %lx, %p (%p), %p (%p)) stub!\n", debugstr_w(wsPrinter
), dwType
,
765 phClassPidl
, (phClassPidl
!= NULL
) ? *(phClassPidl
) : NULL
,
766 phwnd
, (phwnd
!= NULL
) ? *(phwnd
) : NULL
);
771 /*************************************************************************
772 * Printers_UnregisterWindow [SHELL32.214]
774 VOID WINAPI
Printers_UnregisterWindow(HANDLE hClassPidl
, HWND hwnd
)
776 FIXME("(%p, %p) stub!\n", hClassPidl
, hwnd
);
779 /*************************************************************************/
784 LPCWSTR szOtherStuff
;
789 #define IDC_STATIC_TEXT1 100
790 #define IDC_STATIC_TEXT2 101
791 #define IDC_LISTBOX 99
792 #define IDC_WINE_TEXT 98
794 #define DROP_FIELD_TOP (-15)
795 #define DROP_FIELD_HEIGHT 15
797 static BOOL
__get_dropline( HWND hWnd
, LPRECT lprect
)
799 HWND hWndCtl
= GetDlgItem(hWnd
, IDC_WINE_TEXT
);
803 GetWindowRect( hWndCtl
, lprect
);
804 MapWindowPoints( 0, hWnd
, (LPPOINT
)lprect
, 2 );
805 lprect
->bottom
= (lprect
->top
+= DROP_FIELD_TOP
);
811 /*************************************************************************
812 * SHAppBarMessage [SHELL32.@]
814 UINT WINAPI
SHAppBarMessage(DWORD msg
, PAPPBARDATA data
)
816 int width
=data
->rc
.right
- data
->rc
.left
;
817 int height
=data
->rc
.bottom
- data
->rc
.top
;
823 return ABS_ALWAYSONTOP
| ABS_AUTOHIDE
;
824 case ABM_GETTASKBARPOS
:
825 GetWindowRect(data
->hWnd
, &rec
);
829 SetActiveWindow(data
->hWnd
);
831 case ABM_GETAUTOHIDEBAR
:
832 data
->hWnd
=GetActiveWindow();
835 SetWindowPos(data
->hWnd
,HWND_TOP
,rec
.left
,rec
.top
,
836 width
,height
,SWP_SHOWWINDOW
);
839 GetWindowRect(data
->hWnd
, &(data
->rc
));
842 FIXME("ABM_REMOVE broken\n");
843 /* FIXME: this is wrong; should it be DestroyWindow instead? */
844 /*CloseHandle(data->hWnd);*/
846 case ABM_SETAUTOHIDEBAR
:
847 SetWindowPos(data
->hWnd
,HWND_TOP
,rec
.left
+1000,rec
.top
,
848 width
,height
,SWP_SHOWWINDOW
);
851 data
->uEdge
=(ABE_RIGHT
| ABE_LEFT
);
852 SetWindowPos(data
->hWnd
,HWND_TOP
,data
->rc
.left
,data
->rc
.top
,
853 width
,height
,SWP_SHOWWINDOW
);
855 case ABM_WINDOWPOSCHANGED
:
861 /*************************************************************************
862 * SHHelpShortcuts_RunDLLA [SHELL32.@]
865 DWORD WINAPI
SHHelpShortcuts_RunDLLA(DWORD dwArg1
, DWORD dwArg2
, DWORD dwArg3
, DWORD dwArg4
)
867 FIXME("(%lx, %lx, %lx, %lx) stub!\n", dwArg1
, dwArg2
, dwArg3
, dwArg4
);
871 /*************************************************************************
872 * SHHelpShortcuts_RunDLLA [SHELL32.@]
875 DWORD WINAPI
SHHelpShortcuts_RunDLLW(DWORD dwArg1
, DWORD dwArg2
, DWORD dwArg3
, DWORD dwArg4
)
877 FIXME("(%lx, %lx, %lx, %lx) stub!\n", dwArg1
, dwArg2
, dwArg3
, dwArg4
);
881 /*************************************************************************
882 * SHLoadInProc [SHELL32.@]
883 * Create an instance of specified object class from within
884 * the shell process and release it immediately
886 HRESULT WINAPI
SHLoadInProc (REFCLSID rclsid
)
890 TRACE("%s\n", debugstr_guid(rclsid
));
892 CoCreateInstance(rclsid
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IUnknown
,&ptr
);
895 IUnknown
* pUnk
= ptr
;
896 IUnknown_Release(pUnk
);
899 return DISP_E_MEMBERNOTFOUND
;
902 /*************************************************************************
903 * AboutDlgProc (internal)
905 INT_PTR CALLBACK
AboutDlgProc( HWND hWnd
, UINT msg
, WPARAM wParam
,
916 ABOUT_INFO
*info
= (ABOUT_INFO
*)lParam
;
917 WCHAR Template
[512], AppTitle
[512];
921 const char* const *pstr
= SHELL_Authors
;
922 SendDlgItemMessageW(hWnd
, stc1
, STM_SETICON
,(WPARAM
)info
->hIcon
, 0);
923 GetWindowTextW( hWnd
, Template
, sizeof(Template
)/sizeof(WCHAR
) );
924 sprintfW( AppTitle
, Template
, info
->szApp
);
925 SetWindowTextW( hWnd
, AppTitle
);
926 SetWindowTextW( GetDlgItem(hWnd
, IDC_STATIC_TEXT1
), info
->szApp
);
927 SetWindowTextW( GetDlgItem(hWnd
, IDC_STATIC_TEXT2
), info
->szOtherStuff
);
928 hWndCtl
= GetDlgItem(hWnd
, IDC_LISTBOX
);
929 SendMessageW( hWndCtl
, WM_SETREDRAW
, 0, 0 );
930 SendMessageW( hWndCtl
, WM_SETFONT
, (WPARAM
)info
->hFont
, 0 );
934 /* authors list is in iso-8859-1 format */
935 MultiByteToWideChar( 28591, 0, *pstr
, -1, name
, sizeof(name
)/sizeof(WCHAR
) );
936 SendMessageW( hWndCtl
, LB_ADDSTRING
, (WPARAM
)-1, (LPARAM
)name
);
939 SendMessageW( hWndCtl
, WM_SETREDRAW
, 1, 0 );
948 HDC hDC
= BeginPaint( hWnd
, &ps
);
950 if (__get_dropline( hWnd
, &rect
))
952 SelectObject( hDC
, GetStockObject( BLACK_PEN
) );
953 MoveToEx( hDC
, rect
.left
, rect
.top
, NULL
);
954 LineTo( hDC
, rect
.right
, rect
.bottom
);
956 EndPaint( hWnd
, &ps
);
961 if (wParam
== IDOK
|| wParam
== IDCANCEL
)
963 EndDialog(hWnd
, TRUE
);
968 EndDialog(hWnd
, TRUE
);
976 /*************************************************************************
977 * ShellAboutA [SHELL32.288]
979 BOOL WINAPI
ShellAboutA( HWND hWnd
, LPCSTR szApp
, LPCSTR szOtherStuff
, HICON hIcon
)
982 LPWSTR appW
= NULL
, otherW
= NULL
;
987 len
= MultiByteToWideChar(CP_ACP
, 0, szApp
, -1, NULL
, 0);
988 appW
= HeapAlloc(GetProcessHeap(), 0, len
* sizeof(WCHAR
));
989 MultiByteToWideChar(CP_ACP
, 0, szApp
, -1, appW
, len
);
993 len
= MultiByteToWideChar(CP_ACP
, 0, szOtherStuff
, -1, NULL
, 0);
994 otherW
= HeapAlloc(GetProcessHeap(), 0, len
* sizeof(WCHAR
));
995 MultiByteToWideChar(CP_ACP
, 0, szOtherStuff
, -1, otherW
, len
);
998 ret
= ShellAboutW(hWnd
, appW
, otherW
, hIcon
);
1000 HeapFree(GetProcessHeap(), 0, otherW
);
1001 HeapFree(GetProcessHeap(), 0, appW
);
1006 /*************************************************************************
1007 * ShellAboutW [SHELL32.289]
1009 BOOL WINAPI
ShellAboutW( HWND hWnd
, LPCWSTR szApp
, LPCWSTR szOtherStuff
,
1017 static const WCHAR wszSHELL_ABOUT_MSGBOX
[] =
1018 {'S','H','E','L','L','_','A','B','O','U','T','_','M','S','G','B','O','X',0};
1022 if(!(hRes
= FindResourceW(shell32_hInstance
, wszSHELL_ABOUT_MSGBOX
, (LPWSTR
)RT_DIALOG
)))
1024 if(!(template = (LPVOID
)LoadResource(shell32_hInstance
, hRes
)))
1027 info
.szOtherStuff
= szOtherStuff
;
1028 info
.hIcon
= hIcon
? hIcon
: LoadIconW( 0, (LPWSTR
)IDI_WINLOGO
);
1030 SystemParametersInfoW( SPI_GETICONTITLELOGFONT
, 0, &logFont
, 0 );
1031 info
.hFont
= CreateFontIndirectW( &logFont
);
1033 bRet
= DialogBoxIndirectParamW((HINSTANCE
)GetWindowLongPtrW( hWnd
, GWLP_HINSTANCE
),
1034 template, hWnd
, AboutDlgProc
, (LPARAM
)&info
);
1035 DeleteObject(info
.hFont
);
1039 /*************************************************************************
1040 * FreeIconList (SHELL32.@)
1042 void WINAPI
FreeIconList( DWORD dw
)
1044 FIXME("%lx: stub\n",dw
);
1048 /***********************************************************************
1049 * DllGetVersion [SHELL32.@]
1051 * Retrieves version information of the 'SHELL32.DLL'
1054 * pdvi [O] pointer to version information structure.
1058 * Failure: E_INVALIDARG
1061 * Returns version of a shell32.dll from IE4.01 SP1.
1064 HRESULT WINAPI
DllGetVersion (DLLVERSIONINFO
*pdvi
)
1066 /* FIXME: shouldn't these values come from the version resource? */
1067 if (pdvi
->cbSize
== sizeof(DLLVERSIONINFO
) ||
1068 pdvi
->cbSize
== sizeof(DLLVERSIONINFO2
))
1070 pdvi
->dwMajorVersion
= WINE_FILEVERSION_MAJOR
;
1071 pdvi
->dwMinorVersion
= WINE_FILEVERSION_MINOR
;
1072 pdvi
->dwBuildNumber
= WINE_FILEVERSION_BUILD
;
1073 pdvi
->dwPlatformID
= WINE_FILEVERSION_PLATFORMID
;
1074 if (pdvi
->cbSize
== sizeof(DLLVERSIONINFO2
))
1076 DLLVERSIONINFO2
*pdvi2
= (DLLVERSIONINFO2
*)pdvi
;
1079 pdvi2
->ullVersion
= MAKEDLLVERULL(WINE_FILEVERSION_MAJOR
,
1080 WINE_FILEVERSION_MINOR
,
1081 WINE_FILEVERSION_BUILD
,
1082 WINE_FILEVERSION_PLATFORMID
);
1084 TRACE("%lu.%lu.%lu.%lu\n",
1085 pdvi
->dwMajorVersion
, pdvi
->dwMinorVersion
,
1086 pdvi
->dwBuildNumber
, pdvi
->dwPlatformID
);
1091 WARN("wrong DLLVERSIONINFO size from app\n");
1092 return E_INVALIDARG
;
1096 /*************************************************************************
1097 * global variables of the shell32.dll
1098 * all are once per process
1101 HINSTANCE shell32_hInstance
= 0;
1102 HIMAGELIST ShellSmallIconList
= 0;
1103 HIMAGELIST ShellBigIconList
= 0;
1106 /*************************************************************************
1110 * calling oleinitialize here breaks sone apps.
1112 BOOL WINAPI
DllMain(HINSTANCE hinstDLL
, DWORD fdwReason
, LPVOID fImpLoad
)
1114 TRACE("%p 0x%lx %p\n", hinstDLL
, fdwReason
, fImpLoad
);
1118 case DLL_PROCESS_ATTACH
:
1119 shell32_hInstance
= hinstDLL
;
1120 DisableThreadLibraryCalls(shell32_hInstance
);
1122 /* get full path to this DLL for IExtractIconW_fnGetIconLocation() */
1123 GetModuleFileNameW(hinstDLL
, swShell32Name
, MAX_PATH
);
1124 swShell32Name
[MAX_PATH
- 1] = '\0';
1126 InitCommonControlsEx(NULL
);
1130 InitChangeNotifications();
1133 case DLL_PROCESS_DETACH
:
1134 shell32_hInstance
= 0;
1136 FreeChangeNotifications();
1142 /*************************************************************************
1143 * DllInstall [SHELL32.@]
1147 * BOOL bInstall - TRUE for install, FALSE for uninstall
1148 * LPCWSTR pszCmdLine - command line (unused by shell32?)
1151 HRESULT WINAPI
DllInstall(BOOL bInstall
, LPCWSTR cmdline
)
1153 FIXME("%s %s: stub\n", bInstall
? "TRUE":"FALSE", debugstr_w(cmdline
));
1154 return S_OK
; /* indicate success */
1157 /***********************************************************************
1158 * DllCanUnloadNow (SHELL32.@)
1160 HRESULT WINAPI
DllCanUnloadNow(void)