From 6101324f3bb99029ebabe846f61458dd861231e2 Mon Sep 17 00:00:00 2001 From: Juergen Schmied Date: Fri, 16 Oct 1998 15:40:20 +0000 Subject: [PATCH] Many bugfixes, new stubs SHGetRealIDL, SHRegQueryValue32W, SHRegQueryValueEx32W, StrRetToStrN, StrChrW, SHAllocShared, SHLockShared, SHUnlockShared, SHFreeShared, SetAppStartingCursor32, SHLoadOLE32, Shell_MergeMenus32, PathGetDriveNumber32, DriveType32, SHAbortInvokeCommand, SHOutOfMemoryMessageBox, SHFlushClipboard. --- dlls/shell32/pidl.c | 37 ++++- dlls/shell32/shell32_main.c | 40 +++--- dlls/shell32/shellord.c | 334 +++++++++++++++++++++++++++++++++++++++++--- dlls/shell32/shlfolder.c | 24 ++-- dlls/shell32/shlview.c | 42 +++--- include/shlobj.h | 3 + relay32/shell32.spec | 54 +++---- 7 files changed, 434 insertions(+), 100 deletions(-) diff --git a/dlls/shell32/pidl.c b/dlls/shell32/pidl.c index 0a72b7d05dc..afb16b0e001 100644 --- a/dlls/shell32/pidl.c +++ b/dlls/shell32/pidl.c @@ -119,6 +119,9 @@ LPITEMIDLIST WINAPI ILCloneFirst(LPCITEMIDLIST pidl) { DWORD len; LPITEMIDLIST newpidl=NULL; + TRACE(pidl,"pidl=%p \n",pidl); + pdump(pidl); + if (pidl) { len = pidl->mkid.cb; newpidl = (LPITEMIDLIST) SHAlloc (len+2); @@ -126,8 +129,8 @@ LPITEMIDLIST WINAPI ILCloneFirst(LPCITEMIDLIST pidl) { memcpy(newpidl,pidl,len); ILGetNext(newpidl)->mkid.cb = 0x00; } - } - TRACE(pidl,"pidl=%p newpidl=%p\n",pidl, newpidl); + } + TRACE(pidl,"-- newpidl=%p\n",newpidl); return newpidl; } @@ -196,6 +199,16 @@ LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1,LPCITEMIDLIST pidl2) return pidlNew; } /************************************************************************* + * SHGetRealIDL [SHELL32.98] + * + * NOTES + */ +LPITEMIDLIST WINAPI SHGetRealIDL(DWORD x, DWORD y, DWORD z) +{ FIXME(pidl,"0x%04lx 0x%04lx 0x%04lx\n",x,y,z); + return 0; +} + +/************************************************************************* * SHLogILFromFSIL [SHELL32.95] * * NOTES @@ -263,12 +276,24 @@ LPITEMIDLIST WINAPI ILGetNext(LPITEMIDLIST pidl) * NOTES * Adds the single item to the idlist indicated by pidl. * if bEnd is 0, adds the item to the front of the list, - * otherwise adds the item to the end. - * Destroys the passed in idlist! + * otherwise adds the item to the end. (???) + * Destroys the passed in idlist! (???) */ LPITEMIDLIST WINAPI ILAppend(LPITEMIDLIST pidl,LPCITEMIDLIST item,BOOL32 bEnd) -{ FIXME(pidl,"(pidl=%p,pidl=%p,%08u)stub\n",pidl,item,bEnd); - return NULL; +{ LPITEMIDLIST idlRet; + WARN(pidl,"(pidl=%p,pidl=%p,%08u)semi-stub\n",pidl,item,bEnd); + pdump (pidl); + pdump (item); + + if (_ILIsDesktop(pidl)) + { idlRet = ILClone(item); + if (pidl) + SHFree (pidl); + return idlRet; + } + idlRet=ILCombine(pidl,item); + SHFree(pidl); + return idlRet; } /************************************************************************* * ILFree [SHELL32.155] diff --git a/dlls/shell32/shell32_main.c b/dlls/shell32/shell32_main.c index 212dc8d2b10..6c2bb6b5aad 100644 --- a/dlls/shell32/shell32_main.c +++ b/dlls/shell32/shell32_main.c @@ -451,10 +451,11 @@ HRESULT WINAPI SHGetSpecialFolderLocation(HWND32 hwndOwner, INT32 nFolder, LPITE enum { FT_UNKNOWN= 0x00000000, FT_DIR= 0x00000001, - FT_DESKTOP= 0x00000002 + FT_DESKTOP= 0x00000002, + FT_SPECIAL= 0x00000003 } tFolder; - TRACE(shell,"(%04x,%d,%p)\n", hwndOwner,nFolder,ppidl); + TRACE(shell,"(%04x,0x%x,%p)\n", hwndOwner,nFolder,ppidl); strcpy(buffer,"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\\"); @@ -467,15 +468,15 @@ HRESULT WINAPI SHGetSpecialFolderLocation(HWND32 hwndOwner, INT32 nFolder, LPITE tFolder=FT_DIR; switch (nFolder) { case CSIDL_BITBUCKET: - strcpy (buffer,"xxx"); /*not in the registry*/ - TRACE (shell,"looking for Recycler\n"); - tFolder=FT_UNKNOWN; - break; + strcpy (buffer,"xxx"); /*not in the registry*/ + TRACE (shell,"looking for Recycler\n"); + tFolder=FT_UNKNOWN; + break; case CSIDL_CONTROLS: - strcpy (buffer,"xxx"); /*virtual folder*/ - TRACE (shell,"looking for Control\n"); + strcpy (buffer,"xxx"); /*virtual folder*/ + TRACE (shell,"looking for Control\n"); tFolder=FT_UNKNOWN; - break; + break; case CSIDL_DESKTOP: strcpy (buffer,"xxx"); /*virtual folder*/ TRACE (shell,"looking for Desktop\n"); @@ -487,7 +488,7 @@ HRESULT WINAPI SHGetSpecialFolderLocation(HWND32 hwndOwner, INT32 nFolder, LPITE case CSIDL_DRIVES: strcpy (buffer,"xxx"); /*virtual folder*/ TRACE (shell,"looking for Drives\n"); - tFolder=FT_UNKNOWN; + tFolder=FT_SPECIAL; break; case CSIDL_FONTS: strcpy (buffer,"Fonts"); @@ -545,7 +546,7 @@ HRESULT WINAPI SHGetSpecialFolderLocation(HWND32 hwndOwner, INT32 nFolder, LPITE { GetWindowsDirectory32A(npath,MAX_PATH); PathAddBackslash(npath); switch (nFolder) - { case CSIDL_DESKTOPDIRECTORY: + { case CSIDL_DESKTOPDIRECTORY: strcat (npath,"Desktop"); break; case CSIDL_FONTS: @@ -554,13 +555,13 @@ HRESULT WINAPI SHGetSpecialFolderLocation(HWND32 hwndOwner, INT32 nFolder, LPITE case CSIDL_NETHOOD: strcat (npath,"NetHood"); break; - case CSIDL_PERSONAL: + case CSIDL_PERSONAL: strcpy (npath,"C:\\Personal"); break; case CSIDL_FAVORITES: strcat (npath,"Favorites"); break; - case CSIDL_PRINTERS: + case CSIDL_PRINTERS: strcat (npath,"PrintHood"); break; case CSIDL_PROGRAMS: @@ -596,16 +597,19 @@ HRESULT WINAPI SHGetSpecialFolderLocation(HWND32 hwndOwner, INT32 nFolder, LPITE } TRACE(shell,"value %s=%s created\n",buffer,npath); CreateDirectory32A(npath,NULL); - strcpy(tpath,npath); + strcpy(tpath,npath); } break; case FT_DESKTOP: - strcpy (tpath,"Desktop"); - break; + strcpy (tpath,"Desktop"); + break; + case FT_SPECIAL: + if (nFolder==CSIDL_DRIVES) + strcpy (tpath,"My Computer"); + break; default: - RegCloseKey(key); + RegCloseKey(key); return E_OUTOFMEMORY; - break; } RegCloseKey(key); diff --git a/dlls/shell32/shellord.c b/dlls/shell32/shellord.c index d40bebddbcb..9b6bc02fdcb 100644 --- a/dlls/shell32/shellord.c +++ b/dlls/shell32/shellord.c @@ -990,54 +990,66 @@ HRESULT WINAPI SHGetDataFromIDListA(DWORD u, DWORD v, DWORD w, DWORD x, DWORD y) return 0; } /************************************************************************* - * SHRegCloseKey [SHELL32.505] + * SHRegCloseKey32 [NT4.0:SHELL32.505] * - * XXX I am not sure if the given param is correct. :-) */ -HRESULT WINAPI SHRegCloseKey(HKEY key) -{ FIXME(shell,"(0x%08lx)\n", key); - /* XXX Is this correct? */ - return RegCloseKey(key); +HRESULT WINAPI SHRegCloseKey32 (HKEY hkey) +{ TRACE(shell,"0x%04x\n",hkey); + return RegCloseKey( hkey ); } /************************************************************************* * SHRegOpenKey32A [SHELL32.506] * - * XXX I am not sure if the given param is correct. :-) */ HRESULT WINAPI SHRegOpenKey32A(HKEY hKey, LPSTR lpSubKey, LPHKEY phkResult) -{ FIXME(shell,"(0x%08lx, %s, 0x%08lx)\n", hKey, debugstr_a(lpSubKey), +{ FIXME(shell,"(0x%08x, %s, %p)\n", hKey, debugstr_a(lpSubKey), phkResult); - /* XXX Is this correct? */ return RegOpenKey32A(hKey, lpSubKey, phkResult); } + /************************************************************************* - * SHRegOpenKey32W [SHELL32.507] + * SHRegOpenKey32W [NT4.0:SHELL32.507] * - * XXX I am not sure if the given param is correct. :-) */ -HRESULT WINAPI SHRegOpenKey32W(HKEY hKey, LPWSTR lpSubKey, LPHKEY phkResult) -{ FIXME(shell,"(0x%08lx, %s, 0x%08lx)\n", hKey, debugstr_w(lpSubKey), - phkResult); - /* XXX Is this correct? */ - return RegOpenKey32W(hKey, lpSubKey, phkResult); +HRESULT WINAPI SHRegOpenKey32W (HKEY hkey, LPCWSTR lpszSubKey, LPHKEY retkey) +{ WARN(shell,"0x%04x %s %p\n",hkey,debugstr_w(lpszSubKey),retkey); + return RegOpenKey32W( hkey, lpszSubKey, retkey ); } /************************************************************************* * SHRegQueryValueExA [SHELL32.509] * - * XXX I know this is not the correct parameter. Check with documentation. */ HRESULT WINAPI SHRegQueryValueEx32A(DWORD u, LPSTR v, DWORD w, DWORD x, DWORD y, DWORD z) -{ FIXME(shell,"0x%04lx %s 0x%04lx 0x%04lx 0x%04lx 0x%04lx stub\n",u,debugstr_a(v),w,x,y,z); +{ FIXME(shell,"0x%04lx %s 0x%04lx 0x%04lx 0x%04lx 0x%04lx stub\n", + u,debugstr_a(v),w,x,y,z); return 0; } /************************************************************************* + * SHRegQueryValue32W [NT4.0:SHELL32.510] + * + */ +HRESULT WINAPI SHRegQueryValue32W (HKEY hkey, LPWSTR lpszSubKey, + LPWSTR lpszData, LPDWORD lpcbData ) +{ WARN(shell,"0x%04x %s %p %p semi-stub\n", + hkey, debugstr_w(lpszSubKey), lpszData, lpcbData); + return RegQueryValue32W( hkey, lpszSubKey, lpszData, lpcbData ); +} + +/************************************************************************* * SHRegQueryValueEx32W [NT4.0:SHELL32.511] * + * FIXME + * if the datatype REG_EXPAND_SZ then expand the string and change + * *pdwType to REG_SZ. */ -HRESULT WINAPI SHRegQueryValueEx32W (DWORD u, LPWSTR v, DWORD w, DWORD x, DWORD y, DWORD z) -{ FIXME(shell,"0x%04lx %s 0x%04lx 0x%04lx 0x%04lx 0x%04lx stub\n",u,debugstr_w(v),w,x,y,z); - return 0; +HRESULT WINAPI SHRegQueryValueEx32W (HKEY hkey, LPWSTR pszValue, LPDWORD pdwReserved, + LPDWORD pdwType, LPVOID pvData, LPDWORD pcbData) +{ DWORD ret; + WARN(shell,"0x%04x %s %p %p %p %p semi-stub\n", + hkey, debugstr_w(pszValue), pdwReserved, pdwType, pvData, pcbData); + ret = RegQueryValueEx32W ( hkey, pszValue, pdwReserved, pdwType, pvData, pcbData); + return ret; } /************************************************************************* @@ -1073,10 +1085,286 @@ HRESULT WINAPI IsUserAdmin() return TRUE; } /************************************************************************* - * SHFlushClipboard [SHELL32.121] + * StrRetToStrN [SHELL32.96] + * + * converts a STRRET to a normal string + * + * NOTES + * FIXME the string handling is to simple (different STRRET choices) + * at the moment only CSTR + * the pidl is for STRRET OFFSET + */ +HRESULT WINAPI StrRetToStrN (LPSTR dest, DWORD len, LPSTRRET src, LPITEMIDLIST x) +{ FIXME(shell,"dest=0x%p len=0x%lx strret=0x%p pidl=%p stub\n",dest,len,src,x); + strncpy(dest,src->u.cStr,len); + return S_OK; +} + +/************************************************************************* + * StrChrW [NT 4.0:SHELL32.651] + * + */ +HRESULT WINAPI StrChrW (LPWSTR u, DWORD v) +{ FIXME(shell,"%s 0x%lx stub\n",debugstr_w(u),v); + return 0; +} +/************************************************************************* + * SHAllocShared [SHELL32.520] + * + * NOTES + * parameter1 is return value from HeapAlloc + * parameter2 is equal to the size allocated with HeapAlloc + * parameter3 is return value from GetCurrentProcessId + * + * the return value is posted as lParam with 0x402 (WM_USER+2) to somewhere + * WM_USER+2 could be the undocumented CWM_SETPATH + * the allocated memory contains a pidl + */ +HGLOBAL32 WINAPI SHAllocShared(LPVOID psrc, DWORD size, DWORD procID) +{ HGLOBAL32 hmem; + LPVOID pmem; + + TRACE(shell,"ptr=%p size=0x%04lx procID=0x%04lx\n",psrc,size,procID); + hmem = GlobalAlloc32(GMEM_FIXED, size); + if (!hmem) + return 0; + + pmem = GlobalLock32 (hmem); + + if (! pmem) + return 0; + + memcpy (pmem, psrc, size); + GlobalUnlock32(hmem); + return hmem; +} +/************************************************************************* + * SHLockShared [SHELL32.521] + * + * NOTES + * parameter1 is return value from SHAllocShared + * parameter2 is return value from GetCurrentProcessId + * the receiver of (WM_USER+2) trys to lock the HANDLE (?) + * the returnvalue seems to be a memoryadress + */ +void * WINAPI SHLockShared(HANDLE32 hmem, DWORD procID) +{ TRACE(shell,"handle=0x%04x procID=0x%04lx\n",hmem,procID); + return GlobalLock32(hmem); +} +/************************************************************************* + * SHUnlockShared [SHELL32.522] + * + * NOTES + * parameter1 is return value from SHLockShared + */ +BOOL32 WINAPI SHUnlockShared(HANDLE32 pmem) +{ TRACE(shell,"handle=0x%04x\n",pmem); + return GlobalUnlock32(pmem); +} +/************************************************************************* + * SHFreeShared [SHELL32.523] + * + * NOTES + * parameter1 is return value from SHAllocShared + * parameter2 is return value from GetCurrentProcessId + */ +HANDLE32 WINAPI SHFreeShared(HANDLE32 hmem, DWORD procID) +{ TRACE(shell,"handle=0x%04x 0x%04lx\n",hmem,procID); + return GlobalFree32(hmem); +} + +/************************************************************************* + * SetAppStartingCursor32 [SHELL32.99] * */ -HRESULT WINAPI SHFlushClipboard(VOID) +HRESULT WINAPI SetAppStartingCursor32(DWORD u, DWORD v) +{ FIXME(shell,"0x%04lx 0x%04lx stub\n",u,v ); + return 0; +} +/************************************************************************* + * SHLoadOLE32 [SHELL32.151] + * + */ +HRESULT WINAPI SHLoadOLE32(DWORD u) +{ FIXME(shell,"0x%04lx stub\n",u); + return S_OK; +} +/************************************************************************* + * Shell_MergeMenus32 [SHELL32.67] + * + */ +BOOL32 _SHIsMenuSeparator(HMENU32 hm, int i) +{ + MENUITEMINFO32A mii; + + mii.cbSize = sizeof(MENUITEMINFO32A); + mii.fMask = MIIM_TYPE; + mii.cch = 0; /* WARNING: We MUST initialize it to 0*/ + if (!GetMenuItemInfo32A(hm, i, TRUE, &mii)) + { return(FALSE); + } + + if (mii.fType & MFT_SEPARATOR) + { return(TRUE); + } + + return(FALSE); +} +#define MM_ADDSEPARATOR 0x00000001L +#define MM_SUBMENUSHAVEIDS 0x00000002L +HRESULT WINAPI Shell_MergeMenus32 (HMENU32 hmDst, HMENU32 hmSrc, UINT32 uInsert, UINT32 uIDAdjust, UINT32 uIDAdjustMax, ULONG uFlags) +{ int nItem; + HMENU32 hmSubMenu; + BOOL32 bAlreadySeparated; + MENUITEMINFO32A miiSrc; + char szName[256]; + UINT32 uTemp, uIDMax = uIDAdjust; + + FIXME(shell,"hmenu1=0x%04x hmenu2=0x%04x 0x%04x 0x%04x 0x%04x 0x%04lx stub\n", + hmDst, hmSrc, uInsert, uIDAdjust, uIDAdjustMax, uFlags); + + if (!hmDst || !hmSrc) + { return uIDMax; + } + + nItem = GetMenuItemCount32(hmDst); + if (uInsert >= (UINT32)nItem) + { uInsert = (UINT32)nItem; + bAlreadySeparated = TRUE; + } + else + { bAlreadySeparated = _SHIsMenuSeparator(hmDst, uInsert);; + } + if ((uFlags & MM_ADDSEPARATOR) && !bAlreadySeparated) + { /* Add a separator between the menus */ + InsertMenu32A(hmDst, uInsert, MF_BYPOSITION | MF_SEPARATOR, 0, NULL); + bAlreadySeparated = TRUE; + } + + + /* Go through the menu items and clone them*/ + for (nItem = GetMenuItemCount32(hmSrc) - 1; nItem >= 0; nItem--) + { miiSrc.cbSize = sizeof(MENUITEMINFO32A); + miiSrc.fMask = MIIM_STATE | MIIM_ID | MIIM_SUBMENU | MIIM_CHECKMARKS | MIIM_TYPE | MIIM_DATA; + /* We need to reset this every time through the loop in case + menus DON'T have IDs*/ + miiSrc.fType = MFT_STRING; + miiSrc.dwTypeData = szName; + miiSrc.dwItemData = 0; + miiSrc.cch = sizeof(szName); + + if (!GetMenuItemInfo32A(hmSrc, nItem, TRUE, &miiSrc)) + { continue; + } + if (miiSrc.fType & MFT_SEPARATOR) + { /* This is a separator; don't put two of them in a row*/ + if (bAlreadySeparated) + { continue; + } + bAlreadySeparated = TRUE; + } + else if (miiSrc.hSubMenu) + { if (uFlags & MM_SUBMENUSHAVEIDS) + { /* Adjust the ID and check it*/ + miiSrc.wID += uIDAdjust; + if (miiSrc.wID > uIDAdjustMax) + { continue; + } + if (uIDMax <= miiSrc.wID) + { uIDMax = miiSrc.wID + 1; + } + } + else + { /* Don't set IDs for submenus that didn't have them already */ + miiSrc.fMask &= ~MIIM_ID; + } + hmSubMenu = miiSrc.hSubMenu; + miiSrc.hSubMenu = CreatePopupMenu32(); + if (!miiSrc.hSubMenu) + { return(uIDMax); + } + uTemp = Shell_MergeMenus32(miiSrc.hSubMenu, hmSubMenu, 0, uIDAdjust, uIDAdjustMax, uFlags&MM_SUBMENUSHAVEIDS); + if (uIDMax <= uTemp) + { uIDMax = uTemp; + } + bAlreadySeparated = FALSE; + } + else + { /* Adjust the ID and check it*/ + miiSrc.wID += uIDAdjust; + if (miiSrc.wID > uIDAdjustMax) + { continue; + } + if (uIDMax <= miiSrc.wID) + { uIDMax = miiSrc.wID + 1; + } + bAlreadySeparated = FALSE; + } + if (!InsertMenuItem32A(hmDst, uInsert, TRUE, &miiSrc)) + { return(uIDMax); + } + } + + /* Ensure the correct number of separators at the beginning of the + inserted menu items*/ + if (uInsert == 0) + { if (bAlreadySeparated) + { DeleteMenu32(hmDst, uInsert, MF_BYPOSITION); + } + } + else + { if (_SHIsMenuSeparator(hmDst, uInsert-1)) + { if (bAlreadySeparated) + { DeleteMenu32(hmDst, uInsert, MF_BYPOSITION); + } + } + else + { if ((uFlags & MM_ADDSEPARATOR) && !bAlreadySeparated) + { /* Add a separator between the menus*/ + InsertMenu32A(hmDst, uInsert, MF_BYPOSITION | MF_SEPARATOR, 0, NULL); + } + } + } + return(uIDMax); + +} +/************************************************************************* + * PathGetDriveNumber32 [SHELL32.57] + * + */ +HRESULT WINAPI PathGetDriveNumber32(LPSTR u) +{ FIXME(shell,"%s stub\n",debugstr_a(u)); + return 0; +} +/************************************************************************* + * DriveType32 [SHELL32.64] + * + */ +HRESULT WINAPI DriveType32(DWORD u) +{ FIXME(shell,"0x%04lx stub\n",u); + return 0; +} +/************************************************************************* + * SHAbortInvokeCommand [SHELL32.198] + * + */ +HRESULT WINAPI SHAbortInvokeCommand() { FIXME(shell,"stub\n"); + return 1; +} +/************************************************************************* + * SHOutOfMemoryMessageBox [SHELL32.126] + * + */ +HRESULT WINAPI SHOutOfMemoryMessageBox(DWORD u, DWORD v, DWORD w) +{ FIXME(shell,"0x%04lx 0x%04lx 0x%04lx stub\n",u,v,w); return 0; } +/************************************************************************* + * SHFlushClipboard [SHELL32.121] + * + */ +HRESULT WINAPI SHFlushClipboard() +{ FIXME(shell,"stub\n"); + return 1; +} diff --git a/dlls/shell32/shlfolder.c b/dlls/shell32/shlfolder.c index 359acd68918..e1b13348bd4 100644 --- a/dlls/shell32/shlfolder.c +++ b/dlls/shell32/shlfolder.c @@ -242,6 +242,9 @@ static HRESULT WINAPI IShellFolder_ParseDisplayName( { pidlFull = (LPITEMIDLIST)HeapAlloc(GetProcessHeap(),0,2); pidlFull->mkid.cb = 0; } + else if (strcmp(pszTemp,"My Computer")==0) + { pidlFull = _ILCreateMyComputer(); + } else { pidlFull = _ILCreateMyComputer(); @@ -394,6 +397,8 @@ static HRESULT WINAPI IShellFolder_CompareIDs(LPSHELLFOLDER this, LPCITEMIDLIST pidlTemp1 = pidl1, pidlTemp2 = pidl2; TRACE(shell,"(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n",this,lParam,pidl1,pidl2); + pdump (pidl1); + pdump (pidl2); if (!pidl1 && !pidl2) return 0; @@ -601,13 +606,13 @@ static HRESULT WINAPI IShellFolder_GetUIObjectOf( LPSHELLFOLDER this,HWND32 hwnd #define GET_SHGDN_RELATION(dwFlags) ((DWORD)dwFlags & (DWORD)0x000000FF) static HRESULT WINAPI IShellFolder_GetDisplayNameOf( LPSHELLFOLDER this, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET lpName) -{ CHAR szText[MAX_PATH]; - CHAR szTemp[MAX_PATH]; - CHAR szSpecial[MAX_PATH]; - CHAR szDrive[MAX_PATH]; - DWORD dwVolumeSerialNumber,dwMaximumComponetLength,dwFileSystemFlags; - LPITEMIDLIST pidlTemp=NULL; - BOOL32 bSimplePidl=FALSE; +{ CHAR szText[MAX_PATH]; + CHAR szTemp[MAX_PATH]; + CHAR szSpecial[MAX_PATH]; + CHAR szDrive[MAX_PATH]; + DWORD dwVolumeSerialNumber,dwMaximumComponetLength,dwFileSystemFlags; + LPITEMIDLIST pidlTemp=NULL; + BOOL32 bSimplePidl=FALSE; TRACE(shell,"(%p)->(pidl=%p,0x%08lx,%p)\n",this,pidl,dwFlags,lpName); @@ -740,7 +745,10 @@ static BOOL32 WINAPI IShellFolder_GetFolderPath(LPSHELLFOLDER this, LPSTR lpszOu } *lpszOut=0; - + + if (! this->mlpszFolder) + return FALSE; + dwSize = strlen (this->mlpszFolder) +1; if ( dwSize > dwOutSize) return FALSE; diff --git a/dlls/shell32/shlview.c b/dlls/shell32/shlview.c index dd51f048f13..c6d27731a63 100644 --- a/dlls/shell32/shlview.c +++ b/dlls/shell32/shlview.c @@ -361,10 +361,10 @@ LRESULT ShellView_OnSize(LPSHELLVIEW this, WORD wWidth, WORD wHeight) * ShellView_BuildFileMenu() */ HMENU32 ShellView_BuildFileMenu(LPSHELLVIEW this) -{ CHAR szText[MAX_PATH]; +{ CHAR szText[MAX_PATH]; MENUITEMINFO32A mii; - int nTools,i; - HMENU32 hSubMenu; + int nTools,i; + HMENU32 hSubMenu; TRACE(shell,"(%p) semi-stub\n",this); @@ -381,7 +381,7 @@ HMENU32 ShellView_BuildFileMenu(LPSHELLVIEW this) mii.cbSize = sizeof(mii); mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE; - if(TBSTYLE_SEP != g_Tools[i].bStyle) + if(TBSTYLE_SEP != g_Tools[i].bStyle) /* no seperator*/ { mii.fType = MFT_STRING; mii.fState = MFS_ENABLED; mii.dwTypeData = szText; @@ -394,13 +394,14 @@ HMENU32 ShellView_BuildFileMenu(LPSHELLVIEW this) InsertMenuItem32A(hSubMenu, (UINT32)-1, TRUE, &mii); } } + TRACE(shell,"-- return (menu=0x%x)\n",hSubMenu); return hSubMenu; } /************************************************************************** * ShellView_MergeFileMenu() */ void ShellView_MergeFileMenu(LPSHELLVIEW this, HMENU32 hSubMenu) -{ MENUITEMINFO32A mii; +{ MENUITEMINFO32A mii; CHAR szText[MAX_PATH]; TRACE(shell,"(%p)->(submenu=0x%08x) stub\n",this,hSubMenu); @@ -416,7 +417,7 @@ void ShellView_MergeFileMenu(LPSHELLVIEW this, HMENU32 hSubMenu) InsertMenuItem32A(hSubMenu, 0, TRUE, &mii); /*add the file menu items */ - strcpy(szText,"dummy 45"); + strcpy(szText,"dummy 45"); mii.cbSize = sizeof(mii); mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE; @@ -428,14 +429,15 @@ void ShellView_MergeFileMenu(LPSHELLVIEW this, HMENU32 hSubMenu) /*insert this item at the beginning of the menu */ InsertMenuItem32A(hSubMenu, 0, TRUE, &mii); } + TRACE(shell,"--\n"); } /************************************************************************** * ShellView_MergeViewMenu() */ void ShellView_MergeViewMenu(LPSHELLVIEW this, HMENU32 hSubMenu) -{ MENUITEMINFO32A mii; - CHAR szText[MAX_PATH]; +{ MENUITEMINFO32A mii; + CHAR szText[MAX_PATH]; TRACE(shell,"(%p)->(submenu=0x%08x) stub\n",this,hSubMenu); if(hSubMenu) @@ -448,7 +450,7 @@ void ShellView_MergeViewMenu(LPSHELLVIEW this, HMENU32 hSubMenu) InsertMenuItem32A(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, &mii); /*add the view menu items at the correct position in the menu*/ - strcpy(szText,"Dummy 46"); + strcpy(szText,"Dummy 46"); mii.cbSize = sizeof(mii); mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE; @@ -463,7 +465,7 @@ void ShellView_MergeViewMenu(LPSHELLVIEW this, HMENU32 hSubMenu) * ShellView_UpdateMenu() */ LRESULT ShellView_UpdateMenu(LPSHELLVIEW this, HMENU32 hMenu) -{ TRACE(shell,"(%p)->(menu=0x%08x\n",this,hMenu); +{ TRACE(shell,"(%p)->(menu=0x%08x)\n",this,hMenu); CheckMenuItem32(hMenu, IDM_VIEW_FILES, MF_BYCOMMAND | (g_bViewKeys ? MF_CHECKED: MF_UNCHECKED)); if(ShellView_CanDoIDockingWindow(this)) @@ -474,7 +476,7 @@ LRESULT ShellView_UpdateMenu(LPSHELLVIEW this, HMENU32 hMenu) { EnableMenuItem32(hMenu, IDM_VIEW_IDW, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); CheckMenuItem32(hMenu, IDM_VIEW_IDW, MF_BYCOMMAND | MF_UNCHECKED); } - return 0; + return S_OK; } /************************************************************************** @@ -498,7 +500,7 @@ void ShellView_OnDeactivate(LPSHELLVIEW this) } /************************************************************************** -* CShellView_OnActivate() +* ShellView_OnActivate() */ LRESULT ShellView_OnActivate(LPSHELLVIEW this, UINT32 uState) { OLEMENUGROUPWIDTHS32 omw = { {0, 0, 0, 0, 0, 0} }; @@ -521,7 +523,7 @@ LRESULT ShellView_OnActivate(LPSHELLVIEW this, UINT32 uState) if(this->hMenu) { this->pShellBrowser->lpvtbl->fnInsertMenusSB(this->pShellBrowser, this->hMenu, &omw); - + TRACE(shell,"-- after fnInsertMenusSB\n"); /*build the top level menu get the menu item's text*/ strcpy(szText,"dummy 31"); @@ -558,11 +560,13 @@ LRESULT ShellView_OnActivate(LPSHELLVIEW this, UINT32 uState) { ShellView_MergeFileMenu(this, mii.hSubMenu); } } + TRACE(shell,"-- before fnSetMenuSB\n"); this->pShellBrowser->lpvtbl->fnSetMenuSB(this->pShellBrowser, this->hMenu, 0, this->hWnd); } } this->uState = uState; - return 0; + TRACE(shell,"--\n"); + return S_OK; } /************************************************************************** @@ -600,7 +604,7 @@ BOOL32 ShellView_AddRemoveDockingWindow(LPSHELLVIEW this, BOOL32 bAdd) LPSERVICEPROVIDER pSP; LPDOCKINGWINDOWFRAME pFrame; - FIXME(shell,"(%p)->(badd=0x%08x) stub\n",this,bAdd); + WARN(shell,"(%p)->(badd=0x%08x) semi-stub\n",this,bAdd); /* get the browser's IServiceProvider */ hr = this->pShellBrowser->lpvtbl->fnQueryInterface(this->pShellBrowser, (REFIID)&IID_IServiceProvider, (LPVOID*)&pSP); @@ -610,6 +614,7 @@ BOOL32 ShellView_AddRemoveDockingWindow(LPSHELLVIEW this, BOOL32 bAdd) if(SUCCEEDED(hr)) { if(bAdd) { hr = S_OK; + FIXME(shell,"no docking implemented\n"); /*if(!this->pDockingWindow) { //create the toolbar object this->pDockingWindow = DockingWindow_Constructor(this, this->hWnd); @@ -625,8 +630,9 @@ BOOL32 ShellView_AddRemoveDockingWindow(LPSHELLVIEW this, BOOL32 bAdd) }*/ } else - { /*if(this->pDockingWindow) - { hr = pFrame->->lpvtbl->fnRemoveToolbar(pFrame, (IDockingWindow*)this->pDockingWindow, DWFRF_NORMAL); + { FIXME(shell,"no docking implemented\n"); +/* if(this->pDockingWindow) + { hr = pFrame->lpvtbl->fnRemoveToolbar(pFrame, (IDockingWindow*)this->pDockingWindow, DWFRF_NORMAL); if(SUCCEEDED(hr)) { // RemoveToolbar should release the toolbar object which will cause @@ -820,7 +826,7 @@ void ShellView_DoContextMenu(LPSHELLVIEW this, WORD x, WORD y, BOOL32 fDefault) } else /* we are acting with a full featured IShellBrowser */ { TRACE(shell,"-- fnBrowseObject pidl =%p\n", this->aSelectedItems[0]); - wFlags = SBSP_DEFBROWSER | SBSP_DEFMODE | SBSP_RELATIVE; + wFlags = SBSP_SAMEBROWSER | SBSP_DEFMODE | SBSP_RELATIVE; this->pShellBrowser->lpvtbl->fnBrowseObject(this->pShellBrowser, this->aSelectedItems[0], wFlags); diff --git a/include/shlobj.h b/include/shlobj.h index 64dfa1dac51..9d5b58af9b8 100644 --- a/include/shlobj.h +++ b/include/shlobj.h @@ -61,6 +61,9 @@ DEFINE_SHLGUID(IID_IPersist, 0x0000010CL, 0, 0); DEFINE_SHLGUID(IID_IViewObject, 0x0000010DL, 0, 0); DEFINE_SHLGUID(IID_IDataObject, 0x0000010EL, 0, 0); +DEFINE_SHLGUID(IID_IDropSource, 0x00000121L, 0, 0); +DEFINE_SHLGUID(IID_IDropTarget, 0x00000122L, 0, 0); + DEFINE_GUID (IID_IServiceProvider, 0x6D5140C1L, 0x7436, 0x11CE, 0x80, 0x34, 0x00, 0xAA, 0x00, 0x60, 0x09, 0xFA); DEFINE_GUID (IID_IDockingWindow, 0x012dd920L, 0x7B26, 0x11D0, 0x8C, 0xA9, 0x00, 0xA0, 0xC9, 0x2D, 0xBF, 0xE8); DEFINE_GUID (IID_IDockingWindowSite, 0x2A342FC2L, 0x7B26, 0x11D0, 0x8C, 0xA9, 0x00, 0xA0, 0xC9, 0x2D, 0xBF, 0xE8); diff --git a/relay32/shell32.spec b/relay32/shell32.spec index 5fe21d1a20b..c1436b76f85 100644 --- a/relay32/shell32.spec +++ b/relay32/shell32.spec @@ -52,27 +52,27 @@ init Shell32LibMain 44 stub DoEnvironmentSubstA # exported by name 45 stdcall PathFileExists(str) PathFileExists 46 stdcall PathMatchSpec (str str) PathMatchSpec - 47 stub PathMakeUniqueName - 48 stub PathSetDlgItemPath - 49 stub PathQualify + 47 stub PathMakeUniqueName@20 + 48 stub PathSetDlgItemPath@12 + 49 stub PathQualify@4 50 stub PathStripToRoot 51 stdcall PathResolve(str long long) PathResolve 52 stdcall PathGetArgs(str) PathGetArgs - 53 stub DoEnvironmentSubstW # exported by name + 53 stub DoEnvironmentSubstW@8 # exported by name 54 stdcall DragAcceptFiles(long long) DragAcceptFiles # exported by name 55 stub PathQuoteSpaces 56 stdcall PathUnquoteSpaces(str) PathUnquoteSpaces - 57 stub PathGetDriveNumber + 57 stdcall PathGetDriveNumber (str) PathGetDriveNumber32 58 stdcall ParseField(str long str long) ParseField 59 stub RestartDialog 60 stdcall ExitWindowsDialog(long) ExitWindowsDialog 61 stdcall RunFileDlg(long long long str str long) RunFileDlg 62 stdcall PickIconDlg(long long long long) PickIconDlg 63 stdcall GetFileNameFromBrowse(long long long long str str str) GetFileNameFromBrowse - 64 stub DriveType + 64 stdcall DriveType (long) DriveType32 65 stub InvalidateDriveType 66 stub IsNetDrive - 67 stub Shell_MergeMenus + 67 stdcall Shell_MergeMenus (long long long long long long) Shell_MergeMenus32 68 stdcall SHGetSettings(long long long) SHGetSettings 69 stub SHGetNetResource 70 stub SHCreateDefClassObject @@ -101,10 +101,10 @@ init Shell32LibMain 93 stub Win32CreateDirectory 94 stub Win32RemoveDirectory 95 stdcall SHLogILFromFSIL (ptr) SHLogILFromFSIL - 96 stub StrRetToStrN + 96 stdcall StrRetToStrN (long long long long) StrRetToStrN 97 stub SHWaitForFileToOpen - 98 stub SHGetRealIDL - 99 stub SetAppStartingCursor + 98 stdcall SHGetRealIDL (long long long) SHGetRealIDL + 99 stdcall SetAppStartingCursor (long long) SetAppStartingCursor32 100 stdcall SHRestricted(long) SHRestricted 101 stub DragQueryFileAorW # exported by name 102 stdcall SHCoCreateInstance(ptr ptr long ptr ptr) SHCoCreateInstance @@ -126,12 +126,12 @@ init Shell32LibMain 118 stdcall FileMenu_Destroy (long) FileMenu_Destroy 119 stdcall IsLFNDrive(str) IsLFNDrive 120 stub FileMenu_AbortInitMenu - 121 stdcall SHFlushClipboard() SHFlushClipboard + 121 stdcall SHFlushClipboard () SHFlushClipboard 122 stub RunDLL_CallEntry16 123 stdcall SHFreeUnusedLibraries (long) SHFreeUnusedLibraries 124 stub FileMenu_AppendFilesForPidl 125 stub FileMenu_AddFilesForPidl - 126 stub SHOutOfMemoryMessageBox + 126 stdcall SHOutOfMemoryMessageBox (long long long) SHOutOfMemoryMessageBox 127 stdcall SHWinHelp (long long long long) SHWinHelp 128 stdcall DllGetClassObject(long long ptr) SHELL32_DllGetClassObject 129 stub DAD_AutoScroll @@ -156,17 +156,17 @@ init Shell32LibMain 148 stdcall ExtractAssociatedIconA(long ptr long) ExtractAssociatedIcon32A # exported by name 149 stdcall SHFind_InitMenuPopup(long long long long) SHFind_InitMenuPopup 150 stub ExtractAssociatedIconExA # exported by name - 151 stub SHLoadOLE + 151 stdcall SHLoadOLE (long) SHLoadOLE32 152 stdcall ILGetSize(ptr) ILGetSize 153 stdcall ILGetNext(ptr) ILGetNext - 154 stub ILAppend + 154 stdcall ILAppend (long long long) ILAppend 155 stdcall ILFree(ptr) ILFree 156 stub ILGlobalFree 157 stdcall ILCreateFromPath (ptr) ILCreateFromPath 158 stdcall PathGetExtension(str long long) PathGetExtension 159 stub PathIsDirectory 160 stub SHNetConnectionDialog - 161 stdcall SHRunControlPanel (long long)SHRunControlPanel + 161 stdcall SHRunControlPanel (long long) SHRunControlPanel 162 stub SHSimpleIDListFromPath 163 stub StrToOleStr 164 stub Win32DeleteFile @@ -203,7 +203,7 @@ init Shell32LibMain 195 stdcall SHFree(ptr) SHFree 196 stdcall SHAlloc(long) SHAlloc 197 stub SHGlobalDefect - 198 stub SHAbortInvokeCommand + 198 stdcall SHAbortInvokeCommand () SHAbortInvokeCommand 199 stub SHGetFileIcon 200 stub SHLocalAlloc 201 stub SHLocalFree @@ -310,7 +310,7 @@ init Shell32LibMain 301 stub StrChrA # proper ordinal unknown 302 stub StrChrIA # proper ordinal unknown 303 stub StrChrIW # proper ordinal unknown - 304 stub StrChrW # proper ordinal unknown + 304 stdcall StrChrW (ptr ptr) StrChrW # proper ordinal unknown 305 stub StrCmpNA # proper ordinal unknown 306 stub StrCmpNIA # proper ordinal unknown 307 stub StrCmpNIW # proper ordinal unknown @@ -337,19 +337,19 @@ init Shell32LibMain 328 stub StrStrW # proper ordinal unknown 329 stub WOWShellExecute # proper ordinal unknown - 505 stdcall SHRegCloseKey (long) SHRegCloseKey + 505 stdcall SHRegCloseKey (long) SHRegCloseKey32 506 stdcall SHRegOpenKeyA (long str long) SHRegOpenKey32A - 507 stdcall SHRegOpenKeyW (long wstr long) SHRegOpenKey32W + 507 stdcall SHRegOpenKeyW (long wstr long long) SHRegOpenKey32W 508 stub SHRegQueryValueA@16 509 stdcall SHRegQueryValueExA(long str ptr ptr ptr ptr) SHRegQueryValueEx32A - 510 stub SHRegQueryValueW@16 + 510 stdcall SHRegQueryValueW (long long long long) SHRegQueryValue32W 511 stdcall SHRegQueryValueExW (long wstr ptr ptr ptr ptr) SHRegQueryValueEx32W 512 stub SHRegDeleteKeyW@8 - 520 stub SHAllocShared@12 - 521 stub SHLockShared@8 - 522 stub SHUnlockShared@4 - 523 stub SHFreeShared@8 + 520 stdcall SHAllocShared (long long long) SHAllocShared + 521 stdcall SHLockShared (long long) SHLockShared + 522 stdcall SHUnlockShared (long) SHUnlockShared + 523 stdcall SHFreeShared (long long) SHFreeShared 524 stub RealDriveType@8 525 stub RealDriveTypeFlags@8 @@ -360,13 +360,13 @@ init Shell32LibMain 644 stub SHChangeNotification_Lock@16 645 stub SHChangeNotification_Unlock@4 646 stub SHChangeRegistrationReceive@8 - 647 stub ReceiveAddToRecentDocs + 647 stub ReceiveAddToRecentDocs@8 648 stub SHWaitOp_Operate@8 - 650 stub PathIsSameRoot + 650 stub PathIsSameRoot@8 651 stdcall ReadCabinetState (long long) ReadCabinetState 652 stdcall WriteCabinetState (long) WriteCabinetState - 653 stub PathProcessCommand + 653 stub PathProcessCommand@16 660 stdcall FileIconInit (long) FileIconInit -- 2.11.4.GIT