From 725c02614b9f94d67ad73fcc5f6ab05167bc27dd Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Wed, 21 Mar 2018 08:59:42 +0300 Subject: [PATCH] comdlg32: Use shell API directly. Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- dlls/comdlg32/cdlg.h | 12 ------ dlls/comdlg32/cdlg32.c | 32 -------------- dlls/comdlg32/filedlg.c | 79 +++++++++++++++++----------------- dlls/comdlg32/filedlgbrowser.c | 24 +++++------ 4 files changed, 50 insertions(+), 97 deletions(-) diff --git a/dlls/comdlg32/cdlg.h b/dlls/comdlg32/cdlg.h index be0a298e132..eebf1a9b2b1 100644 --- a/dlls/comdlg32/cdlg.h +++ b/dlls/comdlg32/cdlg.h @@ -206,19 +206,7 @@ void FILEDLG95_OnOpenMessage(HWND hwnd, int idCaption, int idText) DECLSPEC_HIDD extern BOOL GetFileName31A( OPENFILENAMEA *lpofn, UINT dlgType ) DECLSPEC_HIDDEN; extern BOOL GetFileName31W( OPENFILENAMEW *lpofn, UINT dlgType ) DECLSPEC_HIDDEN; -/* ITEMIDLIST */ - -extern LPITEMIDLIST (WINAPI *COMDLG32_PIDL_ILClone) (LPCITEMIDLIST); -extern LPITEMIDLIST (WINAPI *COMDLG32_PIDL_ILCombine)(LPCITEMIDLIST,LPCITEMIDLIST); -extern LPITEMIDLIST (WINAPI *COMDLG32_PIDL_ILGetNext)(LPITEMIDLIST); -extern BOOL (WINAPI *COMDLG32_PIDL_ILRemoveLastID)(LPCITEMIDLIST); -extern BOOL (WINAPI *COMDLG32_PIDL_ILIsEqual)(LPCITEMIDLIST, LPCITEMIDLIST); -extern UINT (WINAPI *COMDLG32_PIDL_ILGetSize)(LPCITEMIDLIST); - /* SHELL */ -extern LPVOID (WINAPI *COMDLG32_SHAlloc)(DWORD); -extern DWORD (WINAPI *COMDLG32_SHFree)(LPVOID); -extern BOOL (WINAPI *COMDLG32_SHGetFolderPathW)(HWND,int,HANDLE,DWORD,LPWSTR); extern LPITEMIDLIST (WINAPI *COMDLG32_SHSimpleIDListFromPathAW)(LPCVOID); #define ONOPEN_BROWSE 1 diff --git a/dlls/comdlg32/cdlg32.c b/dlls/comdlg32/cdlg32.c index a00da2dda76..9997094ff03 100644 --- a/dlls/comdlg32/cdlg32.c +++ b/dlls/comdlg32/cdlg32.c @@ -44,20 +44,8 @@ DECLSPEC_HIDDEN HINSTANCE COMDLG32_hInstance = 0; static DWORD COMDLG32_TlsIndex = TLS_OUT_OF_INDEXES; static HINSTANCE SHELL32_hInstance; -static HINSTANCE SHFOLDER_hInstance; - -/* ITEMIDLIST */ -LPITEMIDLIST (WINAPI *COMDLG32_PIDL_ILClone) (LPCITEMIDLIST) DECLSPEC_HIDDEN; -LPITEMIDLIST (WINAPI *COMDLG32_PIDL_ILCombine)(LPCITEMIDLIST,LPCITEMIDLIST) DECLSPEC_HIDDEN; -LPITEMIDLIST (WINAPI *COMDLG32_PIDL_ILGetNext)(LPITEMIDLIST) DECLSPEC_HIDDEN; -BOOL (WINAPI *COMDLG32_PIDL_ILRemoveLastID)(LPCITEMIDLIST) DECLSPEC_HIDDEN; -BOOL (WINAPI *COMDLG32_PIDL_ILIsEqual)(LPCITEMIDLIST, LPCITEMIDLIST) DECLSPEC_HIDDEN; -UINT (WINAPI *COMDLG32_PIDL_ILGetSize)(LPCITEMIDLIST) DECLSPEC_HIDDEN; /* SHELL */ -LPVOID (WINAPI *COMDLG32_SHAlloc)(DWORD) DECLSPEC_HIDDEN; -DWORD (WINAPI *COMDLG32_SHFree)(LPVOID) DECLSPEC_HIDDEN; -BOOL (WINAPI *COMDLG32_SHGetFolderPathW)(HWND,int,HANDLE,DWORD,LPWSTR) DECLSPEC_HIDDEN; LPITEMIDLIST (WINAPI *COMDLG32_SHSimpleIDListFromPathAW)(LPCVOID) DECLSPEC_HIDDEN; /*********************************************************************** @@ -89,33 +77,13 @@ BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD Reason, LPVOID Reserved) SHELL32_hInstance = GetModuleHandleA("SHELL32.DLL"); - /* ITEMIDLIST */ - GPA(COMDLG32_PIDL_ILIsEqual, SHELL32_hInstance, (LPCSTR)21L); - GPA(COMDLG32_PIDL_ILCombine, SHELL32_hInstance, (LPCSTR)25L); - GPA(COMDLG32_PIDL_ILGetNext, SHELL32_hInstance, (LPCSTR)153L); - GPA(COMDLG32_PIDL_ILClone, SHELL32_hInstance, (LPCSTR)18L); - GPA(COMDLG32_PIDL_ILRemoveLastID, SHELL32_hInstance, (LPCSTR)17L); - GPA(COMDLG32_PIDL_ILGetSize, SHELL32_hInstance, (LPCSTR)152L); - /* SHELL */ GPA(COMDLG32_SHSimpleIDListFromPathAW, SHELL32_hInstance, (LPCSTR)162); - GPA(COMDLG32_SHAlloc, SHELL32_hInstance, (LPCSTR)196L); - GPA(COMDLG32_SHFree, SHELL32_hInstance, (LPCSTR)195L); - - /* for the first versions of shell32 SHGetFolderPathW is in SHFOLDER.DLL */ - COMDLG32_SHGetFolderPathW = (void*)GetProcAddress(SHELL32_hInstance,"SHGetFolderPathW"); - if (!COMDLG32_SHGetFolderPathW) - { - SHFOLDER_hInstance = LoadLibraryA("SHFOLDER.DLL"); - GPA(COMDLG32_SHGetFolderPathW, SHFOLDER_hInstance,"SHGetFolderPathW"); - } - break; case DLL_PROCESS_DETACH: if (Reserved) break; if (COMDLG32_TlsIndex != TLS_OUT_OF_INDEXES) TlsFree(COMDLG32_TlsIndex); - if(SHFOLDER_hInstance) FreeLibrary(SHFOLDER_hInstance); break; } return TRUE; diff --git a/dlls/comdlg32/filedlg.c b/dlls/comdlg32/filedlg.c index 13226e0cec5..fa3832cd6fa 100644 --- a/dlls/comdlg32/filedlg.c +++ b/dlls/comdlg32/filedlg.c @@ -1048,7 +1048,7 @@ static INT_PTR FILEDLG95_HandleCustomDialogMessages(HWND hwnd, UINT uMsg, WPARAM break; case CDM_GETFOLDERIDLIST: - retval = COMDLG32_PIDL_ILGetSize(fodInfos->ShellInfos.pidlAbsCurrent); + retval = ILGetSize(fodInfos->ShellInfos.pidlAbsCurrent); if (retval <= wParam) memcpy((void*)lParam, fodInfos->ShellInfos.pidlAbsCurrent, retval); break; @@ -1806,19 +1806,20 @@ static LRESULT FILEDLG95_InitControls(HWND hwnd) if (!handledPath && (win2000plus || win98plus)) { fodInfos->initdir = heap_alloc(MAX_PATH * sizeof(WCHAR)); - if(!COMDLG32_SHGetFolderPathW(hwnd, CSIDL_PERSONAL, 0, 0, fodInfos->initdir)) + if (SHGetFolderPathW(hwnd, CSIDL_PERSONAL, 0, 0, fodInfos->initdir) == S_OK) { - if(!COMDLG32_SHGetFolderPathW(hwnd, CSIDL_DESKTOPDIRECTORY|CSIDL_FLAG_CREATE, 0, 0, fodInfos->initdir)) - { - /* last fallback */ - GetCurrentDirectoryW(MAX_PATH, fodInfos->initdir); - TRACE("No personal or desktop dir, using cwd as failsafe: %s\n", debugstr_w(fodInfos->initdir)); - } else { + if (SHGetFolderPathW(hwnd, CSIDL_DESKTOPDIRECTORY|CSIDL_FLAG_CREATE, 0, 0, fodInfos->initdir) == S_OK) + { + /* last fallback */ + GetCurrentDirectoryW(MAX_PATH, fodInfos->initdir); + TRACE("No personal or desktop dir, using cwd as failsafe: %s\n", debugstr_w(fodInfos->initdir)); + } + else TRACE("No personal dir, using desktop instead: %s\n", debugstr_w(fodInfos->initdir)); - } - } else { - TRACE("No initial dir specified, using personal files dir of %s\n", debugstr_w(fodInfos->initdir)); } + else + TRACE("No initial dir specified, using personal files dir of %s\n", debugstr_w(fodInfos->initdir)); + handledPath = TRUE; } else if (!handledPath) { fodInfos->initdir = heap_alloc(MAX_PATH * sizeof(WCHAR)); @@ -1954,8 +1955,7 @@ static LRESULT FILEDLG95_FillControls(HWND hwnd, WPARAM wParam, LPARAM lParam) /* Browse to the initial directory */ IShellBrowser_BrowseObject(fodInfos->Shell.FOIShellBrowser,pidlItemId, SBSP_ABSOLUTE); - /* Free pidlItem memory */ - COMDLG32_SHFree(pidlItemId); + ILFree(pidlItemId); return TRUE; } @@ -2039,7 +2039,7 @@ static LRESULT FILEDLG95_OnWMCommand(HWND hwnd, WPARAM wParam) SHGetSpecialFolderLocation(0, CSIDL_DESKTOP, &pidl); filedlg_browse_to_pidl(fodInfos, pidl); - COMDLG32_SHFree(pidl); + ILFree(pidl); break; } @@ -2179,7 +2179,7 @@ BOOL FILEDLG95_OnOpenMultipleFiles(HWND hwnd, LPWSTR lpstrFileList, UINT nFileCo /* move to the next file in the list of files */ lpstrTemp += lstrlenW(lpstrTemp) + 1; - COMDLG32_SHFree(pidl); + ILFree(pidl); } } @@ -2510,7 +2510,7 @@ int FILEDLG95_ValidatePathAction(LPWSTR lpstrPathAndFile, IShellFolder **ppsf, nOpenAction = ONOPEN_OPEN; break; } - COMDLG32_SHFree(pidl); + ILFree(pidl); pidl = NULL; } else if (!(flags & OFN_NOVALIDATE)) @@ -2542,7 +2542,7 @@ int FILEDLG95_ValidatePathAction(LPWSTR lpstrPathAndFile, IShellFolder **ppsf, break; } } - if(pidl) COMDLG32_SHFree(pidl); + ILFree(pidl); return nOpenAction; } @@ -2661,7 +2661,7 @@ BOOL FILEDLG95_OnOpen(HWND hwnd) LPITEMIDLIST pidlCurrent; IPersistFolder2_GetCurFolder(ppf2, &pidlCurrent); IPersistFolder2_Release(ppf2); - if( ! COMDLG32_PIDL_ILIsEqual(pidlCurrent, fodInfos->ShellInfos.pidlAbsCurrent)) + if (!ILIsEqual(pidlCurrent, fodInfos->ShellInfos.pidlAbsCurrent)) { if (SUCCEEDED(IShellBrowser_BrowseObject(fodInfos->Shell.FOIShellBrowser, pidlCurrent, SBSP_ABSOLUTE)) && fodInfos->ofnInfos->Flags & OFN_EXPLORER) @@ -2675,7 +2675,7 @@ BOOL FILEDLG95_OnOpen(HWND hwnd) if (fodInfos->Shell.FOIShellView) IShellView_Refresh(fodInfos->Shell.FOIShellView); } - COMDLG32_SHFree(pidlCurrent); + ILFree(pidlCurrent); if (filename_is_edit( fodInfos )) SendMessageW(fodInfos->DlgInfos.hwndFileName, EM_SETSEL, 0, -1); else @@ -3033,7 +3033,7 @@ static void FILEDLG95_SHELL_Clean(HWND hwnd) TRACE("\n"); - COMDLG32_SHFree(fodInfos->ShellInfos.pidlAbsCurrent); + ILFree(fodInfos->ShellInfos.pidlAbsCurrent); /* clean Shell interfaces */ if (fodInfos->Shell.FOIShellView) @@ -3317,7 +3317,7 @@ static void FILEDLG95_LOOKIN_Init(HWND hwndCombo) /* Initialise data of Desktop folder */ SHGetSpecialFolderLocation(0,CSIDL_DESKTOP,&pidlTmp); FILEDLG95_LOOKIN_AddItem(hwndCombo, pidlTmp,LISTEND); - COMDLG32_SHFree(pidlTmp); + ILFree(pidlTmp); SHGetSpecialFolderLocation(0,CSIDL_DRIVES,&pidlDrives); @@ -3336,7 +3336,7 @@ static void FILEDLG95_LOOKIN_Init(HWND hwndCombo) if (!FILEDLG95_unixfs_is_rooted_at_desktop()) { /* special handling for CSIDL_DRIVES */ - if (COMDLG32_PIDL_ILIsEqual(pidlTmp, pidlDrives)) + if (ILIsEqual(pidlTmp, pidlDrives)) { if(SUCCEEDED(IShellFolder_BindToObject(psfRoot, pidlTmp, NULL, &IID_IShellFolder, (LPVOID*)&psfDrives))) { @@ -3345,10 +3345,10 @@ static void FILEDLG95_LOOKIN_Init(HWND hwndCombo) { while (S_OK == IEnumIDList_Next(lpeDrives, 1, &pidlTmp1, NULL)) { - pidlAbsTmp = COMDLG32_PIDL_ILCombine(pidlTmp, pidlTmp1); + pidlAbsTmp = ILCombine(pidlTmp, pidlTmp1); FILEDLG95_LOOKIN_AddItem(hwndCombo, pidlAbsTmp,LISTEND); - COMDLG32_SHFree(pidlAbsTmp); - COMDLG32_SHFree(pidlTmp1); + ILFree(pidlAbsTmp); + ILFree(pidlTmp1); } IEnumIDList_Release(lpeDrives); } @@ -3357,14 +3357,14 @@ static void FILEDLG95_LOOKIN_Init(HWND hwndCombo) } } - COMDLG32_SHFree(pidlTmp); + ILFree(pidlTmp); } IEnumIDList_Release(lpeRoot); } IShellFolder_Release(psfRoot); } - COMDLG32_SHFree(pidlDrives); + ILFree(pidlDrives); } /*********************************************************************** @@ -3528,12 +3528,12 @@ static int FILEDLG95_LOOKIN_AddItem(HWND hwnd,LPITEMIDLIST pidl, int iInsertId) /* Calculate the indentation of the item in the lookin*/ pidlNext = pidl; - while( (pidlNext=COMDLG32_PIDL_ILGetNext(pidlNext)) ) + while ((pidlNext = ILGetNext(pidlNext))) { tmpFolder->m_iIndent++; } - tmpFolder->pidlItem = COMDLG32_PIDL_ILClone(pidl); + tmpFolder->pidlItem = ILClone(pidl); if(tmpFolder->m_iIndent > liInfos->iMaxIndentation) liInfos->iMaxIndentation = tmpFolder->m_iIndent; @@ -3568,7 +3568,7 @@ static int FILEDLG95_LOOKIN_AddItem(HWND hwnd,LPITEMIDLIST pidl, int iInsertId) return iItemID; } - COMDLG32_SHFree( tmpFolder->pidlItem ); + ILFree( tmpFolder->pidlItem ); heap_free( tmpFolder ); return -1; @@ -3597,8 +3597,7 @@ static int FILEDLG95_LOOKIN_InsertItemAfterParent(HWND hwnd,LPITEMIDLIST pidl) iParentPos = FILEDLG95_LOOKIN_InsertItemAfterParent(hwnd,pidlParent); } - /* Free pidlParent memory */ - COMDLG32_SHFree(pidlParent); + ILFree(pidlParent); return FILEDLG95_LOOKIN_AddItem(hwnd,pidl,iParentPos + 1); } @@ -3665,7 +3664,7 @@ static int FILEDLG95_LOOKIN_RemoveMostExpandedItem(HWND hwnd) if((iItemPos = FILEDLG95_LOOKIN_SearchItem(hwnd,liInfos->iMaxIndentation,SEARCH_EXP)) >=0) { SFOLDER *tmpFolder = (LPSFOLDER) CBGetItemDataPtr(hwnd,iItemPos); - COMDLG32_SHFree(tmpFolder->pidlItem); + ILFree(tmpFolder->pidlItem); heap_free(tmpFolder); SendMessageW(hwnd, CB_DELETESTRING, iItemPos, 0); liInfos->iMaxIndentation--; @@ -3697,7 +3696,7 @@ static int FILEDLG95_LOOKIN_SearchItem(HWND hwnd,WPARAM searchArg,int iSearchMet { LPSFOLDER tmpFolder = (LPSFOLDER) CBGetItemDataPtr(hwnd,i); - if(iSearchMethod == SEARCH_PIDL && COMDLG32_PIDL_ILIsEqual((LPITEMIDLIST)searchArg,tmpFolder->pidlItem)) + if (iSearchMethod == SEARCH_PIDL && ILIsEqual((LPITEMIDLIST)searchArg, tmpFolder->pidlItem)) return i; if(iSearchMethod == SEARCH_EXP && tmpFolder->m_iIndent == (int)searchArg) return i; @@ -3728,7 +3727,7 @@ static void FILEDLG95_LOOKIN_Clean(HWND hwnd) for(iPos = iCount-1;iPos>=0;iPos--) { SFOLDER *tmpFolder = (LPSFOLDER) CBGetItemDataPtr(fodInfos->DlgInfos.hwndLookInCB,iPos); - COMDLG32_SHFree(tmpFolder->pidlItem); + ILFree(tmpFolder->pidlItem); heap_free(tmpFolder); SendMessageW(fodInfos->DlgInfos.hwndLookInCB, CB_DELETESTRING, iPos, 0); } @@ -3845,7 +3844,7 @@ static HRESULT COMDLG32_StrRetToStrNW (LPWSTR dest, DWORD len, LPSTRRET src, con { case STRRET_WSTR: lstrcpynW(dest, src->u.pOleStr, len); - COMDLG32_SHFree(src->u.pOleStr); + CoTaskMemFree(src->u.pOleStr); break; case STRRET_CSTR: @@ -3939,7 +3938,7 @@ LPITEMIDLIST GetPidlFromDataObject ( IDataObject *doSelected, UINT nPidlIndex) LPIDA cida = GlobalLock(medium.u.hGlobal); if(nPidlIndex <= cida->cidl) { - pidl = COMDLG32_PIDL_ILClone((LPITEMIDLIST)(&((LPBYTE)cida)[cida->aoffset[nPidlIndex]])); + pidl = ILClone((LPITEMIDLIST)(&((LPBYTE)cida)[cida->aoffset[nPidlIndex]])); } COMCTL32_ReleaseStgMedium(medium); } @@ -4050,8 +4049,8 @@ LPITEMIDLIST GetParentPidl(LPITEMIDLIST pidl) TRACE("%p\n", pidl); - pidlParent = COMDLG32_PIDL_ILClone(pidl); - COMDLG32_PIDL_ILRemoveLastID(pidlParent); + pidlParent = ILClone(pidl); + ILRemoveLastID(pidlParent); return pidlParent; } @@ -4131,7 +4130,7 @@ static BOOL BrowseSelectedFolder(HWND hwnd) if(fodInfos->ofnInfos->Flags & OFN_EXPLORER) SendCustomDlgNotificationMessage(hwnd,CDN_FOLDERCHANGE); } - COMDLG32_SHFree( pidlSelection ); + ILFree( pidlSelection ); } return bBrowseSelFolder; diff --git a/dlls/comdlg32/filedlgbrowser.c b/dlls/comdlg32/filedlgbrowser.c index baa9f1a7907..1b119f6c2be 100644 --- a/dlls/comdlg32/filedlgbrowser.c +++ b/dlls/comdlg32/filedlgbrowser.c @@ -40,6 +40,7 @@ #include "shlguid.h" #include "servprov.h" #include "wine/debug.h" +#include "wine/heap.h" WINE_DEFAULT_DEBUG_CHANNEL(commdlg); @@ -155,7 +156,7 @@ static BOOL COMDLG32_StrRetToStrNW (LPVOID dest, DWORD len, LPSTRRET src, LPCITE { case STRRET_WSTR: lstrcpynW(dest, src->u.pOleStr, len); - COMDLG32_SHFree(src->u.pOleStr); + CoTaskMemFree(src->u.pOleStr); break; case STRRET_CSTR: @@ -194,7 +195,7 @@ IShellBrowser * IShellBrowserImpl_Construct(HWND hwndOwner) FileOpenDlgInfos *fodInfos = get_filedlg_infoptr(hwndOwner); IShellBrowserImpl *sb; - sb = COMDLG32_SHAlloc(sizeof(IShellBrowserImpl)); + sb = heap_alloc(sizeof(*sb)); /* Initialisation of the member variables */ sb->ref=1; @@ -267,10 +268,8 @@ static ULONG WINAPI IShellBrowserImpl_Release(IShellBrowser * iface) TRACE("(%p,%u)\n", This, ref + 1); if (!ref) - { - COMDLG32_SHFree(This); - TRACE("-- destroyed\n"); - } + heap_free(This); + return ref; } @@ -363,7 +362,7 @@ static HRESULT WINAPI IShellBrowserImpl_BrowseObject(IShellBrowser *iface, return hRes; } /* create an absolute pidl */ - pidlTmp = COMDLG32_PIDL_ILCombine(fodInfos->ShellInfos.pidlAbsCurrent, pidl); + pidlTmp = ILCombine(fodInfos->ShellInfos.pidlAbsCurrent, pidl); } else if(wFlags & SBSP_PARENT) { @@ -375,7 +374,7 @@ static HRESULT WINAPI IShellBrowserImpl_BrowseObject(IShellBrowser *iface, else /* SBSP_ABSOLUTE is 0x0000 */ { /* An absolute pidl (relative from the desktop) */ - pidlTmp = COMDLG32_PIDL_ILClone(pidl); + pidlTmp = ILClone(pidl); psfTmp = GetShellFolderFromPidl(pidlTmp); } @@ -387,10 +386,10 @@ static HRESULT WINAPI IShellBrowserImpl_BrowseObject(IShellBrowser *iface, /* If the pidl to browse to is equal to the actual pidl ... do nothing and pretend you did it*/ - if(COMDLG32_PIDL_ILIsEqual(pidlTmp,fodInfos->ShellInfos.pidlAbsCurrent)) + if (ILIsEqual(pidlTmp, fodInfos->ShellInfos.pidlAbsCurrent)) { IShellFolder_Release(psfTmp); - COMDLG32_SHFree(pidlTmp); + ILFree(pidlTmp); TRACE("keep current folder\n"); return NOERROR; } @@ -430,7 +429,7 @@ static HRESULT WINAPI IShellBrowserImpl_BrowseObject(IShellBrowser *iface, fodInfos->Shell.FOIShellFolder = psfTmp; /* Release old pidlAbsCurrent and update its value */ - COMDLG32_SHFree(fodInfos->ShellInfos.pidlAbsCurrent); + ILFree(fodInfos->ShellInfos.pidlAbsCurrent); fodInfos->ShellInfos.pidlAbsCurrent = pidlTmp; COMDLG32_UpdateCurrentDir(fodInfos); @@ -784,8 +783,7 @@ static HRESULT WINAPI IShellBrowserImpl_ICommDlgBrowser_OnDefaultCommand(ICommDl hRes = S_OK; } - /* Free memory used by pidl */ - COMDLG32_SHFree(pidl); + ILFree(pidl); return hRes; }