5 * 1998 Juergen Schmied (jsch) * <juergen.schmied@metronet.de>
10 #include "wine/winuser16.h"
16 #include "sysmetrics.h"
17 #include "debugtools.h"
20 #include "winversion.h"
25 #include "shell32_main.h"
29 DECLARE_DEBUG_CHANNEL(exec)
30 DECLARE_DEBUG_CHANNEL(shell)
32 /*************************************************************************
33 * CommandLineToArgvW [SHELL32.7]
35 LPWSTR* WINAPI CommandLineToArgvW(LPWSTR cmdline,LPDWORD numargs)
40 /* to get writeable copy */
41 cmdline = HEAP_strdupW( GetProcessHeap(), 0, cmdline);
48 while (*s && *s==0x0020)
54 argv=(LPWSTR*)HeapAlloc( GetProcessHeap(), 0, sizeof(LPWSTR)*(i+1) );
60 argv[i++]=HEAP_strdupW( GetProcessHeap(), 0, t );
62 while (*s && *s==0x0020)
73 argv[i++]=(LPWSTR)HEAP_strdupW( GetProcessHeap(), 0, t );
75 HeapFree( GetProcessHeap(), 0, cmdline );
81 /*************************************************************************
82 * Control_RunDLL [SHELL32.12]
84 * Wild speculation in the following!
86 * http://premium.microsoft.com/msdn/library/techart/msdn193.htm
89 void WINAPI Control_RunDLL( HWND hwnd, LPCVOID code, LPCSTR cmd, DWORD arg4 )
91 FIXME_(shell)("(0x%08x, %p, %s, 0x%08lx): stub\n", hwnd, code,
92 debugstr_a(cmd), arg4);
95 /*************************************************************************
96 * SHGetFileInfoA [SHELL32.254]
99 DWORD WINAPI SHGetFileInfoA(LPCSTR path,DWORD dwFileAttributes,
100 SHFILEINFOA *psfi, UINT sizeofpsfi,
102 { CHAR szTemp[MAX_PATH];
104 LPITEMIDLIST pPidlTemp = NULL;
105 DWORD ret=0, dwfa = dwFileAttributes;
107 TRACE_(shell)("(%s,0x%lx,%p,0x%x,0x%x)\n",
108 path,dwFileAttributes,psfi,sizeofpsfi,flags);
110 /* translate the pidl to a path*/
111 if (flags & SHGFI_PIDL)
112 { pPidlTemp = (LPCITEMIDLIST)path;
113 SHGetPathFromIDListA (pPidlTemp, szTemp);
114 TRACE_(shell)("pidl=%p is %s\n", path, szTemp);
117 { strcpy(szTemp,path);
118 TRACE_(shell)("path=%s\n", szTemp);
121 if (flags & SHGFI_ATTRIBUTES)
122 { if (flags & SHGFI_PIDL)
125 * We have to test for the desktop folder first because ILGetDataPointer returns
126 * NULL on the desktop folder.
128 if (_ILIsDesktop((LPCITEMIDLIST)path))
129 { psfi->dwAttributes = SFGAO_HASSUBFOLDER | SFGAO_FOLDER | SFGAO_DROPTARGET | SFGAO_HASPROPSHEET | SFGAO_CANLINK;
133 { pData = _ILGetDataPointer((LPCITEMIDLIST)path);
137 psfi->dwAttributes = SFGAO_HASSUBFOLDER | SFGAO_FOLDER | SFGAO_DROPTARGET | SFGAO_HASPROPSHEET | SFGAO_CANLINK;
139 psfi->dwAttributes = SFGAO_HASSUBFOLDER | SFGAO_FOLDER | SFGAO_FILESYSANCESTOR |
140 SFGAO_DROPTARGET | SFGAO_HASPROPSHEET | SFGAO_CANRENAME | SFGAO_CANLINK ;
142 psfi->dwAttributes = SFGAO_HASSUBFOLDER | SFGAO_FOLDER | SFGAO_CAPABILITYMASK;
144 psfi->dwAttributes = SFGAO_HASSUBFOLDER | SFGAO_FILESYSTEM | SFGAO_FOLDER | SFGAO_FILESYSANCESTOR |
145 SFGAO_DROPTARGET | SFGAO_HASPROPSHEET | SFGAO_CANLINK;
147 psfi->dwAttributes = SFGAO_HASSUBFOLDER | SFGAO_FILESYSTEM | SFGAO_FOLDER | SFGAO_CAPABILITYMASK;
149 psfi->dwAttributes = SFGAO_FILESYSTEM | SFGAO_CAPABILITYMASK;
155 { if (! (flags & SHGFI_USEFILEATTRIBUTES))
156 dwfa = GetFileAttributesA (szTemp);
158 psfi->dwAttributes = SFGAO_FILESYSTEM;
159 if (dwfa == FILE_ATTRIBUTE_DIRECTORY)
160 psfi->dwAttributes |= SFGAO_FOLDER | SFGAO_HASSUBFOLDER;
163 WARN_(shell)("file attributes, semi-stub\n");
166 if (flags & SHGFI_DISPLAYNAME)
167 { if (flags & SHGFI_PIDL)
168 { strcpy(psfi->szDisplayName,szTemp);
171 { strcpy(psfi->szDisplayName,path);
173 TRACE_(shell)("displayname=%s\n", psfi->szDisplayName);
177 if (flags & SHGFI_TYPENAME)
178 { FIXME_(shell)("get the file type, stub\n");
179 strcpy(psfi->szTypeName,"FIXME: Type");
183 if (flags & SHGFI_ICONLOCATION)
184 { FIXME_(shell)("location of icon, stub\n");
185 strcpy(psfi->szDisplayName,"");
189 if (flags & SHGFI_EXETYPE)
190 FIXME_(shell)("type of executable, stub\n");
192 if (flags & SHGFI_LINKOVERLAY)
193 FIXME_(shell)("set icon to link, stub\n");
195 if (flags & SHGFI_OPENICON)
196 FIXME_(shell)("set to open icon, stub\n");
198 if (flags & SHGFI_SELECTED)
199 FIXME_(shell)("set icon to selected, stub\n");
201 if (flags & SHGFI_SHELLICONSIZE)
202 FIXME_(shell)("set icon to shell size, stub\n");
204 if (flags & SHGFI_USEFILEATTRIBUTES)
205 FIXME_(shell)("use the dwFileAttributes, stub\n");
207 if (flags & (SHGFI_UNKNOWN1 | SHGFI_UNKNOWN2 | SHGFI_UNKNOWN3))
208 FIXME_(shell)("unknown attribute!\n");
210 if (flags & SHGFI_ICON)
211 { FIXME_(shell)("icon handle\n");
212 if (flags & SHGFI_SMALLICON)
213 { TRACE_(shell)("set to small icon\n");
214 psfi->hIcon=pImageList_GetIcon(ShellSmallIconList,32,ILD_NORMAL);
215 ret = (DWORD) ShellSmallIconList;
218 { TRACE_(shell)("set to big icon\n");
219 psfi->hIcon=pImageList_GetIcon(ShellBigIconList,32,ILD_NORMAL);
220 ret = (DWORD) ShellBigIconList;
224 if (flags & SHGFI_SYSICONINDEX)
227 { pPidlTemp = ILCreateFromPathA (szTemp);
229 if (SUCCEEDED (SHGetDesktopFolder (&sf)))
230 { psfi->iIcon = SHMapPIDLToSystemImageListIndex (sf, pPidlTemp, 0);
231 IShellFolder_Release(sf);
233 TRACE_(shell)("-- SYSICONINDEX %i\n", psfi->iIcon);
235 if (flags & SHGFI_SMALLICON)
236 { TRACE_(shell)("set to small icon\n");
237 ret = (DWORD) ShellSmallIconList;
240 { TRACE_(shell)("set to big icon\n");
241 ret = (DWORD) ShellBigIconList;
248 /*************************************************************************
249 * SHGetFileInfoW [SHELL32.255]
252 DWORD WINAPI SHGetFileInfoW(LPCWSTR path,DWORD dwFileAttributes,
253 SHFILEINFOW *psfi, UINT sizeofpsfi,
255 { FIXME_(shell)("(%s,0x%lx,%p,0x%x,0x%x)\n",
256 debugstr_w(path),dwFileAttributes,psfi,sizeofpsfi,flags);
260 /*************************************************************************
261 * ExtractIconA [SHELL32.133]
263 HICON WINAPI ExtractIconA( HINSTANCE hInstance, LPCSTR lpszExeFileName,
265 { HGLOBAL16 handle = InternalExtractIcon16(hInstance,lpszExeFileName,nIconIndex, 1);
269 HICON16* ptr = (HICON16*)GlobalLock16(handle);
270 HICON16 hIcon = *ptr;
272 GlobalFree16(handle);
278 /*************************************************************************
279 * ExtractIconW [SHELL32.180]
281 HICON WINAPI ExtractIconW( HINSTANCE hInstance, LPCWSTR lpszExeFileName,
287 exefn = HEAP_strdupWtoA(GetProcessHeap(),0,lpszExeFileName);
288 ret = ExtractIconA(hInstance,exefn,nIconIndex);
290 HeapFree(GetProcessHeap(),0,exefn);
294 /*************************************************************************
295 * FindExecutableA [SHELL32.184]
297 HINSTANCE WINAPI FindExecutableA( LPCSTR lpFile, LPCSTR lpDirectory,
299 { HINSTANCE retval=31; /* default - 'No association was found' */
302 TRACE_(shell)("File %s, Dir %s\n",
303 (lpFile != NULL?lpFile:"-"),
304 (lpDirectory != NULL?lpDirectory:"-"));
306 lpResult[0]='\0'; /* Start off with an empty return string */
308 /* trap NULL parameters on entry */
309 if (( lpFile == NULL ) || ( lpResult == NULL ))
310 { /* FIXME - should throw a warning, perhaps! */
311 return 2; /* File not found. Close enough, I guess. */
315 { GetCurrentDirectoryA( sizeof(old_dir), old_dir );
316 SetCurrentDirectoryA( lpDirectory );
319 retval = SHELL_FindExecutable( lpFile, "open", lpResult );
321 TRACE_(shell)("returning %s\n", lpResult);
323 SetCurrentDirectoryA( old_dir );
327 /*************************************************************************
328 * FindExecutableW [SHELL32.219]
330 HINSTANCE WINAPI FindExecutableW(LPCWSTR lpFile, LPCWSTR lpDirectory,
333 FIXME_(shell)("(%p,%p,%p): stub\n", lpFile, lpDirectory, lpResult);
334 return 31; /* default - 'No association was found' */
343 #define IDC_STATIC_TEXT 100
344 #define IDC_LISTBOX 99
345 #define IDC_WINE_TEXT 98
347 #define DROP_FIELD_TOP (-15)
348 #define DROP_FIELD_HEIGHT 15
350 extern HICON hIconTitleFont;
352 static BOOL __get_dropline( HWND hWnd, LPRECT lprect )
353 { HWND hWndCtl = GetDlgItem(hWnd, IDC_WINE_TEXT);
355 { GetWindowRect( hWndCtl, lprect );
356 MapWindowPoints( 0, hWnd, (LPPOINT)lprect, 2 );
357 lprect->bottom = (lprect->top += DROP_FIELD_TOP);
363 /*************************************************************************
364 * SHAppBarMessage32 [SHELL32.207]
366 UINT WINAPI SHAppBarMessage(DWORD msg, PAPPBARDATA data)
368 FIXME_(shell)("(0x%08lx,%p hwnd=0x%08x): stub\n", msg, data, data->hWnd);
372 return ABS_ALWAYSONTOP | ABS_AUTOHIDE;
373 case ABM_GETTASKBARPOS:
374 /* fake a taskbar on the bottom of the desktop */
376 GetWindowRect(GetDesktopWindow(), &rec);
378 rec.top = rec.bottom - 2;
382 case ABM_GETAUTOHIDEBAR:
386 case ABM_SETAUTOHIDEBAR:
388 case ABM_WINDOWPOSCHANGED:
395 /*************************************************************************
396 * SHGetDesktopFolder [SHELL32.216]
398 * SDK header win95/shlobj.h: This is equivalent to call CoCreateInstance with
400 * CoCreateInstance(CLSID_Desktop, NULL, CLSCTX_INPROC, IID_IShellFolder, &pshf);
403 * the interface to the shell desktop folder.
406 * the pdesktopfolder has to be released at the end (at dll unloading???)
408 LPSHELLFOLDER pdesktopfolder=NULL;
410 DWORD WINAPI SHGetDesktopFolder(LPSHELLFOLDER *shellfolder)
411 { HRESULT hres = E_OUTOFMEMORY;
412 LPCLASSFACTORY lpclf;
413 TRACE_(shell)("%p->(%p)\n",shellfolder,*shellfolder);
419 { lpclf = IClassFactory_Constructor(&CLSID_ShellDesktop);
421 { hres = IClassFactory_CreateInstance(lpclf,NULL,(REFIID)&IID_IShellFolder, (void*)&pdesktopfolder);
422 IClassFactory_Release(lpclf);
427 { *shellfolder = pdesktopfolder;
428 IShellFolder_AddRef(pdesktopfolder);
434 TRACE_(shell)("-- %p->(%p)\n",shellfolder, *shellfolder);
438 /*************************************************************************
439 * SHGetSpecialFolderLocation [SHELL32.223]
441 * gets the folder locations from the registry and creates a pidl
442 * creates missing reg keys and directorys
446 * nFolder [I] CSIDL_xxxxx
447 * ppidl [O] PIDL of a special folder
453 * - look for "User Shell Folder" first
456 HRESULT WINAPI SHGetSpecialFolderLocation(HWND hwndOwner, INT nFolder, LPITEMIDLIST * ppidl)
457 { LPSHELLFOLDER shellfolder;
458 DWORD pchEaten, tpathlen=MAX_PATH, type, dwdisp, res, dwLastError;
459 CHAR pszTemp[256], buffer[256], tpath[MAX_PATH], npath[MAX_PATH];
460 LPWSTR lpszDisplayName = (LPWSTR)&pszTemp[0];
464 { FT_UNKNOWN= 0x00000000,
466 FT_DESKTOP= 0x00000002,
467 FT_SPECIAL= 0x00000003
470 TRACE_(shell)("(%04x,0x%x,%p)\n", hwndOwner,nFolder,ppidl);
472 strcpy(buffer,"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\\");
474 res=RegCreateKeyExA(HKEY_CURRENT_USER,buffer,0,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,&key,&dwdisp);
476 { ERR_(shell)("Could not create key %s %08lx \n",buffer,res);
477 return E_OUTOFMEMORY;
482 { case CSIDL_BITBUCKET:
483 strcpy (buffer,"xxx"); /*not in the registry*/
484 TRACE_(shell)("looking for Recycler\n");
488 strcpy (buffer,"xxx"); /*virtual folder*/
489 TRACE_(shell)("looking for Control\n");
493 strcpy (buffer,"xxx"); /*virtual folder*/
494 TRACE_(shell)("looking for Desktop\n");
497 case CSIDL_DESKTOPDIRECTORY:
498 case CSIDL_COMMON_DESKTOPDIRECTORY:
499 strcpy (buffer,"Desktop");
502 strcpy (buffer,"xxx"); /*virtual folder*/
503 TRACE_(shell)("looking for Drives\n");
507 strcpy (buffer,"Fonts");
510 strcpy (buffer,"NetHood");
512 case CSIDL_PRINTHOOD:
513 strcpy (buffer,"PrintHood");
516 strcpy (buffer,"xxx"); /*virtual folder*/
517 TRACE_(shell)("looking for Network\n");
521 strcpy (buffer,"Appdata");
524 strcpy (buffer,"Personal");
526 case CSIDL_FAVORITES:
527 strcpy (buffer,"Favorites");
530 strcpy (buffer,"PrintHood");
532 case CSIDL_COMMON_PROGRAMS:
534 strcpy (buffer,"Programs");
537 strcpy (buffer,"Recent");
540 strcpy (buffer,"SendTo");
542 case CSIDL_COMMON_STARTMENU:
543 case CSIDL_STARTMENU:
544 strcpy (buffer,"Start Menu");
546 case CSIDL_COMMON_STARTUP:
548 strcpy (buffer,"Startup");
550 case CSIDL_TEMPLATES:
551 strcpy (buffer,"Templates");
553 case CSIDL_INTERNET_CACHE:
554 strcpy (buffer,"Cache");
557 strcpy (buffer,"History");
560 strcpy(buffer,"Cookies");
563 ERR_(shell)("unknown CSIDL 0x%08x\n", nFolder);
568 TRACE_(shell)("Key=%s\n",buffer);
574 /* Directory: get the value from the registry, if its not there
575 create it and the directory*/
576 if (RegQueryValueExA(key,buffer,NULL,&type,(LPBYTE)tpath,&tpathlen))
577 { GetWindowsDirectoryA(npath,MAX_PATH);
578 PathAddBackslashA(npath);
580 { case CSIDL_DESKTOPDIRECTORY:
581 case CSIDL_COMMON_DESKTOPDIRECTORY:
582 strcat (npath,"Desktop");
585 strcat (npath,"Fonts");
588 strcat (npath,"NetHood");
590 case CSIDL_PRINTHOOD:
591 strcat (npath,"PrintHood");
594 strcat (npath,"Appdata");
597 strcpy (npath,"C:\\Personal");
599 case CSIDL_FAVORITES:
600 strcat (npath,"Favorites");
603 strcat (npath,"PrintHood");
605 case CSIDL_COMMON_PROGRAMS:
607 strcat (npath,"Start Menu");
608 CreateDirectoryA(npath,NULL);
609 strcat (npath,"\\Programs");
612 strcat (npath,"Recent");
615 strcat (npath,"SendTo");
617 case CSIDL_COMMON_STARTMENU:
618 case CSIDL_STARTMENU:
619 strcat (npath,"Start Menu");
621 case CSIDL_COMMON_STARTUP:
623 strcat (npath,"Start Menu");
624 CreateDirectoryA(npath,NULL);
625 strcat (npath,"\\Startup");
627 case CSIDL_TEMPLATES:
628 strcat (npath,"Templates");
630 case CSIDL_INTERNET_CACHE:
631 strcat(npath,"Temporary Internet Files");
634 strcat (npath,"History");
637 strcat (npath,"Cookies");
641 return E_OUTOFMEMORY;
643 if (RegSetValueExA(key,buffer,0,REG_SZ,(LPBYTE)npath,sizeof(npath)+1))
644 { ERR_(shell)("could not create value %s\n",buffer);
646 return E_OUTOFMEMORY;
648 TRACE_(shell)("value %s=%s created\n",buffer,npath);
649 dwLastError = GetLastError();
650 CreateDirectoryA(npath,NULL);
651 SetLastError (dwLastError);
656 strcpy (tpath,"Desktop");
659 if (nFolder==CSIDL_DRIVES)
660 strcpy (tpath,"My Computer");
664 return E_OUTOFMEMORY;
669 TRACE_(shell)("Value=%s\n",tpath);
670 LocalToWideChar(lpszDisplayName, tpath, 256);
672 if (SHGetDesktopFolder(&shellfolder)==S_OK)
673 { IShellFolder_ParseDisplayName(shellfolder,hwndOwner, NULL,lpszDisplayName,&pchEaten,ppidl,NULL);
674 IShellFolder_Release(shellfolder);
677 TRACE_(shell)("-- (new pidl %p)\n",*ppidl);
680 /*************************************************************************
681 * SHHelpShortcuts_RunDLL [SHELL32.224]
684 DWORD WINAPI SHHelpShortcuts_RunDLL (DWORD dwArg1, DWORD dwArg2, DWORD dwArg3, DWORD dwArg4)
685 { FIXME_(exec)("(%lx, %lx, %lx, %lx) empty stub!\n",
686 dwArg1, dwArg2, dwArg3, dwArg4);
691 /*************************************************************************
692 * SHLoadInProc [SHELL32.225]
696 DWORD WINAPI SHLoadInProc (DWORD dwArg1)
697 { FIXME_(shell)("(%lx) empty stub!\n", dwArg1);
701 /*************************************************************************
702 * ShellExecuteA [SHELL32.245]
704 HINSTANCE WINAPI ShellExecuteA( HWND hWnd, LPCSTR lpOperation,
705 LPCSTR lpFile, LPCSTR lpParameters,
706 LPCSTR lpDirectory, INT iShowCmd )
707 { TRACE_(shell)("\n");
708 return ShellExecute16( hWnd, lpOperation, lpFile, lpParameters,
709 lpDirectory, iShowCmd );
712 /*************************************************************************
713 * ShellExecuteW [SHELL32.294]
715 * WINSHELLAPI HINSTANCE APIENTRY ShellExecuteW(HWND hwnd, LPCWSTR lpOperation,
716 * LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd);
723 LPCWSTR lpParameters,
727 FIXME_(shell)(": stub\n");
731 /*************************************************************************
732 * AboutDlgProc32 (internal)
734 BOOL WINAPI AboutDlgProc( HWND hWnd, UINT msg, WPARAM wParam,
737 char Template[512], AppTitle[512];
742 { case WM_INITDIALOG:
743 { ABOUT_INFO *info = (ABOUT_INFO *)lParam;
745 { const char* const *pstr = SHELL_People;
746 SendDlgItemMessageA(hWnd, stc1, STM_SETICON,info->hIcon, 0);
747 GetWindowTextA( hWnd, Template, sizeof(Template) );
748 sprintf( AppTitle, Template, info->szApp );
749 SetWindowTextA( hWnd, AppTitle );
750 SetWindowTextA( GetDlgItem(hWnd, IDC_STATIC_TEXT),
751 info->szOtherStuff );
752 hWndCtl = GetDlgItem(hWnd, IDC_LISTBOX);
753 SendMessageA( hWndCtl, WM_SETREDRAW, 0, 0 );
754 SendMessageA( hWndCtl, WM_SETFONT, hIconTitleFont, 0 );
756 { SendMessageA( hWndCtl, LB_ADDSTRING, (WPARAM)-1, (LPARAM)*pstr );
759 SendMessageA( hWndCtl, WM_SETREDRAW, 1, 0 );
767 HDC hDC = BeginPaint( hWnd, &ps );
769 if( __get_dropline( hWnd, &rect ) ) {
770 SelectObject( hDC, GetStockObject( BLACK_PEN ) );
771 MoveToEx( hDC, rect.left, rect.top, NULL );
772 LineTo( hDC, rect.right, rect.bottom );
774 EndPaint( hWnd, &ps );
778 case WM_LBTRACKPOINT:
779 hWndCtl = GetDlgItem(hWnd, IDC_LISTBOX);
780 if( (INT16)GetKeyState16( VK_CONTROL ) < 0 )
781 { if( DragDetect( hWndCtl, *((LPPOINT)&lParam) ) )
782 { INT idx = SendMessageA( hWndCtl, LB_GETCURSEL, 0, 0 );
784 { INT length = SendMessageA( hWndCtl, LB_GETTEXTLEN, (WPARAM)idx, 0 );
785 HGLOBAL16 hMemObj = GlobalAlloc16( GMEM_MOVEABLE, length + 1 );
786 char* pstr = (char*)GlobalLock16( hMemObj );
789 { HCURSOR16 hCursor = LoadCursor16( 0, MAKEINTRESOURCE16(OCR_DRAGOBJECT) );
790 SendMessageA( hWndCtl, LB_GETTEXT, (WPARAM)idx, (LPARAM)pstr );
791 SendMessageA( hWndCtl, LB_DELETESTRING, (WPARAM)idx, 0 );
792 UpdateWindow( hWndCtl );
793 if( !DragObject16((HWND16)hWnd, (HWND16)hWnd, DRAGOBJ_DATA, 0, (WORD)hMemObj, hCursor) )
794 SendMessageA( hWndCtl, LB_ADDSTRING, (WPARAM)-1, (LPARAM)pstr );
797 GlobalFree16( hMemObj );
803 case WM_QUERYDROPOBJECT:
805 { LPDRAGINFO lpDragInfo = (LPDRAGINFO)PTR_SEG_TO_LIN((SEGPTR)lParam);
806 if( lpDragInfo && lpDragInfo->wFlags == DRAGOBJ_DATA )
808 if( __get_dropline( hWnd, &rect ) )
810 pt.x=lpDragInfo->pt.x;
811 pt.x=lpDragInfo->pt.y;
812 rect.bottom += DROP_FIELD_HEIGHT;
813 if( PtInRect( &rect, pt ) )
814 { SetWindowLongA( hWnd, DWL_MSGRESULT, 1 );
824 { LPDRAGINFO lpDragInfo = (LPDRAGINFO)PTR_SEG_TO_LIN((SEGPTR)lParam);
825 if( lpDragInfo && lpDragInfo->wFlags == DRAGOBJ_DATA && lpDragInfo->hList )
826 { char* pstr = (char*)GlobalLock16( (HGLOBAL16)(lpDragInfo->hList) );
828 { static char __appendix_str[] = " with";
830 hWndCtl = GetDlgItem( hWnd, IDC_WINE_TEXT );
831 SendMessageA( hWndCtl, WM_GETTEXT, 512, (LPARAM)Template );
832 if( !lstrncmpA( Template, "WINE", 4 ) )
833 SetWindowTextA( GetDlgItem(hWnd, IDC_STATIC_TEXT), Template );
835 { char* pch = Template + strlen(Template) - strlen(__appendix_str);
837 SendMessageA( GetDlgItem(hWnd, IDC_LISTBOX), LB_ADDSTRING,
838 (WPARAM)-1, (LPARAM)Template );
841 lstrcpyA( Template, pstr );
842 lstrcatA( Template, __appendix_str );
843 SetWindowTextA( hWndCtl, Template );
844 SetWindowLongA( hWnd, DWL_MSGRESULT, 1 );
853 { EndDialog(hWnd, TRUE);
862 /*************************************************************************
863 * ShellAboutA [SHELL32.243]
865 BOOL WINAPI ShellAboutA( HWND hWnd, LPCSTR szApp, LPCSTR szOtherStuff,
872 if(!(hRes = FindResourceA(shell32_hInstance, "SHELL_ABOUT_MSGBOX", RT_DIALOGA)))
874 if(!(template = (LPVOID)LoadResource(shell32_hInstance, hRes)))
878 info.szOtherStuff = szOtherStuff;
880 if (!hIcon) info.hIcon = LoadIcon16( 0, MAKEINTRESOURCE16(OIC_WINEICON) );
881 return DialogBoxIndirectParamA( GetWindowLongA( hWnd, GWL_HINSTANCE ),
882 template, hWnd, AboutDlgProc, (LPARAM)&info );
886 /*************************************************************************
887 * ShellAboutW [SHELL32.244]
889 BOOL WINAPI ShellAboutW( HWND hWnd, LPCWSTR szApp, LPCWSTR szOtherStuff,
898 if(!(hRes = FindResourceA(shell32_hInstance, "SHELL_ABOUT_MSGBOX", RT_DIALOGA)))
900 if(!(template = (LPVOID)LoadResource(shell32_hInstance, hRes)))
903 info.szApp = HEAP_strdupWtoA( GetProcessHeap(), 0, szApp );
904 info.szOtherStuff = HEAP_strdupWtoA( GetProcessHeap(), 0, szOtherStuff );
906 if (!hIcon) info.hIcon = LoadIcon16( 0, MAKEINTRESOURCE16(OIC_WINEICON) );
907 ret = DialogBoxIndirectParamA( GetWindowLongA( hWnd, GWL_HINSTANCE ),
908 template, hWnd, AboutDlgProc, (LPARAM)&info );
909 HeapFree( GetProcessHeap(), 0, (LPSTR)info.szApp );
910 HeapFree( GetProcessHeap(), 0, (LPSTR)info.szOtherStuff );
914 /*************************************************************************
915 * Shell_NotifyIcon [SHELL32.296]
917 * This function is supposed to deal with the systray.
918 * Any ideas on how this is to be implimented?
920 BOOL WINAPI Shell_NotifyIcon( DWORD dwMessage, PNOTIFYICONDATAA pnid )
921 { TRACE_(shell)("\n");
925 /*************************************************************************
926 * Shell_NotifyIcon [SHELL32.297]
928 * This function is supposed to deal with the systray.
929 * Any ideas on how this is to be implimented?
931 BOOL WINAPI Shell_NotifyIconA(DWORD dwMessage, PNOTIFYICONDATAA pnid )
932 { TRACE_(shell)("\n");
936 /*************************************************************************
939 void WINAPI FreeIconList( DWORD dw )
940 { FIXME_(shell)("(%lx): stub\n",dw);
943 /*************************************************************************
944 * SHGetPathFromIDListA [SHELL32.261][NT 4.0: SHELL32.220]
951 * path from a passed PIDL.
957 * fnGetDisplayNameOf can return different types of OLEString
959 DWORD WINAPI SHGetPathFromIDListA (LPCITEMIDLIST pidl,LPSTR pszPath)
961 LPSHELLFOLDER shellfolder;
962 CHAR buffer[MAX_PATH],tpath[MAX_PATH];
963 DWORD type,tpathlen=MAX_PATH,dwdisp;
966 TRACE_(shell)("(pidl=%p,%p)\n",pidl,pszPath);
969 { strcpy(buffer,"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\\");
971 if (RegCreateKeyExA(HKEY_CURRENT_USER,buffer,0,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,&key,&dwdisp))
972 { return E_OUTOFMEMORY;
975 strcpy (buffer,"Desktop"); /*registry name*/
976 if ( RegQueryValueExA(key,buffer,NULL,&type,(LPBYTE)tpath,&tpathlen))
977 { GetWindowsDirectoryA(tpath,MAX_PATH);
978 PathAddBackslashA(tpath);
979 strcat (tpath,"Desktop"); /*folder name*/
980 RegSetValueExA(key,buffer,0,REG_SZ,(LPBYTE)tpath,tpathlen);
981 CreateDirectoryA(tpath,NULL);
984 strcpy(pszPath,tpath);
987 { if (SHGetDesktopFolder(&shellfolder)==S_OK)
988 { IShellFolder_GetDisplayNameOf(shellfolder,pidl,SHGDN_FORPARSING,&lpName);
989 IShellFolder_Release(shellfolder);
991 strcpy(pszPath,lpName.u.cStr);
993 TRACE_(shell)("-- (%s)\n",pszPath);
997 /*************************************************************************
998 * SHGetPathFromIDListW [SHELL32.262]
1000 DWORD WINAPI SHGetPathFromIDListW (LPCITEMIDLIST pidl,LPWSTR pszPath)
1001 { char sTemp[MAX_PATH];
1003 TRACE_(shell)("(pidl=%p)\n", pidl);
1005 SHGetPathFromIDListA (pidl, sTemp);
1006 lstrcpyAtoW(pszPath, sTemp);
1008 TRACE_(shell)("-- (%s)\n",debugstr_w(pszPath));
1013 /*************************************************************************
1014 * SHGetPathFromIDListAW [SHELL32.221][NT 4.0: SHELL32.219]
1016 BOOL WINAPI SHGetPathFromIDListAW(LPCITEMIDLIST pidl,LPVOID pszPath)
1018 TRACE_(shell)("(pidl=%p,%p)\n",pidl,pszPath);
1020 if (VERSION_OsIsUnicode())
1021 return SHGetPathFromIDListW(pidl,pszPath);
1022 return SHGetPathFromIDListA(pidl,pszPath);
1025 /***********************************************************************
1026 * DllGetVersion [COMCTL32.25]
1028 * Retrieves version information of the 'SHELL32.DLL'
1031 * pdvi [O] pointer to version information structure.
1035 * Failure: E_INVALIDARG
1038 * Returns version of a shell32.dll from IE4.01 SP1.
1041 HRESULT WINAPI SHELL32_DllGetVersion (DLLVERSIONINFO *pdvi)
1043 if (pdvi->cbSize != sizeof(DLLVERSIONINFO))
1044 { WARN_(shell)("wrong DLLVERSIONINFO size from app");
1045 return E_INVALIDARG;
1048 pdvi->dwMajorVersion = 4;
1049 pdvi->dwMinorVersion = 72;
1050 pdvi->dwBuildNumber = 3110;
1051 pdvi->dwPlatformID = 1;
1053 TRACE_(shell)("%lu.%lu.%lu.%lu\n",
1054 pdvi->dwMajorVersion, pdvi->dwMinorVersion,
1055 pdvi->dwBuildNumber, pdvi->dwPlatformID);
1059 /*************************************************************************
1060 * global variables of the shell32.dll
1061 * all are once per process
1064 void (WINAPI* pDLLInitComctl)(LPVOID);
1065 INT (WINAPI* pImageList_AddIcon) (HIMAGELIST himl, HICON hIcon);
1066 INT (WINAPI* pImageList_ReplaceIcon) (HIMAGELIST, INT, HICON);
1067 HIMAGELIST (WINAPI * pImageList_Create) (INT,INT,UINT,INT,INT);
1068 BOOL (WINAPI* pImageList_Draw) (HIMAGELIST himl, int i, HDC hdcDest, int x, int y, UINT fStyle);
1069 HICON (WINAPI * pImageList_GetIcon) (HIMAGELIST, INT, UINT);
1070 INT (WINAPI* pImageList_GetImageCount)(HIMAGELIST);
1072 LPVOID (WINAPI* pCOMCTL32_Alloc) (INT);
1073 BOOL (WINAPI* pCOMCTL32_Free) (LPVOID);
1075 HDPA (WINAPI* pDPA_Create) (INT);
1076 INT (WINAPI* pDPA_InsertPtr) (const HDPA, INT, LPVOID);
1077 BOOL (WINAPI* pDPA_Sort) (const HDPA, PFNDPACOMPARE, LPARAM);
1078 LPVOID (WINAPI* pDPA_GetPtr) (const HDPA, INT);
1079 BOOL (WINAPI* pDPA_Destroy) (const HDPA);
1080 INT (WINAPI *pDPA_Search) (const HDPA, LPVOID, INT, PFNDPACOMPARE, LPARAM, UINT);
1081 LPVOID (WINAPI *pDPA_DeletePtr) (const HDPA hdpa, INT i);
1084 HICON (WINAPI *pLookupIconIdFromDirectoryEx)(LPBYTE dir, BOOL bIcon, INT width, INT height, UINT cFlag);
1085 HICON (WINAPI *pCreateIconFromResourceEx)(LPBYTE bits,UINT cbSize, BOOL bIcon, DWORD dwVersion, INT width, INT height,UINT cFlag);
1087 static BOOL bShell32IsInitialized = 0;
1088 static HINSTANCE hComctl32;
1089 static INT shell32_RefCount = 0;
1091 INT shell32_ObjCount = 0;
1092 HINSTANCE shell32_hInstance;
1094 HIMAGELIST ShellSmallIconList = 0;
1095 HIMAGELIST ShellBigIconList = 0;
1098 /*************************************************************************
1103 BOOL WINAPI Shell32LibMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
1106 TRACE_(shell)("0x%x 0x%lx %p\n", hinstDLL, fdwReason, fImpLoad);
1108 shell32_hInstance = hinstDLL;
1112 case DLL_PROCESS_ATTACH:
1113 if (!bShell32IsInitialized)
1115 hComctl32 = LoadLibraryA("COMCTL32.DLL");
1116 hUser32 = GetModuleHandleA("USER32");
1118 if (hComctl32 && hUser32)
1120 pDLLInitComctl=(void*)GetProcAddress(hComctl32,"InitCommonControlsEx");
1122 { pDLLInitComctl(NULL);
1124 pImageList_Create=(void*)GetProcAddress(hComctl32,"ImageList_Create");
1125 pImageList_AddIcon=(void*)GetProcAddress(hComctl32,"ImageList_AddIcon");
1126 pImageList_ReplaceIcon=(void*)GetProcAddress(hComctl32,"ImageList_ReplaceIcon");
1127 pImageList_GetIcon=(void*)GetProcAddress(hComctl32,"ImageList_GetIcon");
1128 pImageList_GetImageCount=(void*)GetProcAddress(hComctl32,"ImageList_GetImageCount");
1129 pImageList_Draw=(void*)GetProcAddress(hComctl32,"ImageList_Draw");
1131 /* imports by ordinal, pray that it works*/
1132 pCOMCTL32_Alloc=(void*)GetProcAddress(hComctl32, (LPCSTR)71L);
1133 pCOMCTL32_Free=(void*)GetProcAddress(hComctl32, (LPCSTR)73L);
1134 pDPA_Create=(void*)GetProcAddress(hComctl32, (LPCSTR)328L);
1135 pDPA_Destroy=(void*)GetProcAddress(hComctl32, (LPCSTR)329L);
1136 pDPA_GetPtr=(void*)GetProcAddress(hComctl32, (LPCSTR)332L);
1137 pDPA_InsertPtr=(void*)GetProcAddress(hComctl32, (LPCSTR)334L);
1138 pDPA_DeletePtr=(void*)GetProcAddress(hComctl32, (LPCSTR)336L);
1139 pDPA_Sort=(void*)GetProcAddress(hComctl32, (LPCSTR)338L);
1140 pDPA_Search=(void*)GetProcAddress(hComctl32, (LPCSTR)339L);
1142 pLookupIconIdFromDirectoryEx=(void*)GetProcAddress(hUser32,"LookupIconIdFromDirectoryEx");
1143 pCreateIconFromResourceEx=(void*)GetProcAddress(hUser32,"CreateIconFromResourceEx");
1146 { ERR_(shell)("P A N I C SHELL32 loading failed\n");
1150 bShell32IsInitialized = TRUE;
1155 case DLL_THREAD_ATTACH:
1159 case DLL_THREAD_DETACH:
1163 case DLL_PROCESS_DETACH:
1165 if ( !shell32_RefCount )
1167 bShell32IsInitialized = FALSE;
1170 { IShellFolder_Release(pdesktopfolder);
1171 pdesktopfolder = NULL;
1175 FreeLibrary(hComctl32);
1177 /* this one is here to check if AddRef/Release is balanced */
1178 if (shell32_ObjCount)
1179 { WARN_(shell)("leaving with %u objects left (memory leak)\n", shell32_ObjCount);
1182 TRACE_(shell)("refcount=%u objcount=%u \n", shell32_RefCount, shell32_ObjCount);