From 3b084fcae522d7983b8b58b732d7f555ed0996f8 Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Tue, 17 Oct 2017 12:56:10 +0200 Subject: [PATCH 1/2] + fix: crash in Favorites management (release version only, debug version didn't crash - so hard to find) + small code refactoring (replacing deprecated methods) --- src/Dialogs.c | 64 ++++++++++---------- src/Dlapi.c | 154 ++++++++++++++++++------------------------------- src/Helpers.c | 29 +++++++++- src/Helpers.h | 2 +- src/Notepad3.c | 35 +++++------ 5 files changed, 127 insertions(+), 157 deletions(-) diff --git a/src/Dialogs.c b/src/Dialogs.c index 98103479b..c1841ab99 100644 --- a/src/Dialogs.c +++ b/src/Dialogs.c @@ -166,20 +166,18 @@ int CALLBACK BFFCallBack(HWND hwnd,UINT umsg,LPARAM lParam,LPARAM lpData) // BOOL GetDirectory(HWND hwndParent,int iTitle,LPWSTR pszFolder,LPCWSTR pszBase,BOOL bNewDialogStyle) { - BROWSEINFO bi; - LPITEMIDLIST pidl; WCHAR szTitle[MIDSZ_BUFFER] = { L'\0' };; WCHAR szBase[MAX_PATH] = { L'\0' }; - BOOL fOk = FALSE; GetString(iTitle,szTitle,COUNTOF(szTitle)); if (!pszBase || !*pszBase) - GetCurrentDirectory(MAX_PATH,szBase); + GetCurrentDirectory(MAX_PATH, szBase); else - StringCchCopy(szBase,COUNTOF(szBase),pszBase); + StringCchCopyN(szBase, COUNTOF(szBase), pszBase, MAX_PATH); + ZeroMemory(&bi, sizeof(BROWSEINFO)); bi.hwndOwner = hwndParent; bi.pidlRoot = NULL; bi.pszDisplayName = pszFolder; @@ -191,15 +189,13 @@ BOOL GetDirectory(HWND hwndParent,int iTitle,LPWSTR pszFolder,LPCWSTR pszBase,BO bi.lParam = (LPARAM)szBase; bi.iImage = 0; - pidl = SHBrowseForFolder(&bi); + LPITEMIDLIST pidl = SHBrowseForFolder(&bi); if (pidl) { SHGetPathFromIDList(pidl,pszFolder); CoTaskMemFree(pidl); - fOk = TRUE; + return TRUE; } - - return fOk; - + return FALSE; } @@ -433,12 +429,10 @@ INT_PTR CALLBACK RunDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) if (bQuickExit) { sei.fMask |= SEE_MASK_NOZONECHECKS; EndDialog(hwnd,IDOK); - CoInitializeEx(NULL,COINIT_APARTMENTTHREADED | COINIT_SPEED_OVER_MEMORY); ShellExecuteEx(&sei); } else { - CoInitializeEx(NULL,COINIT_APARTMENTTHREADED | COINIT_SPEED_OVER_MEMORY); if (ShellExecuteEx(&sei)) EndDialog(hwnd,IDOK); @@ -671,8 +665,6 @@ BOOL OpenWithDlg(HWND hwnd,LPCWSTR lpstrFile) StringCchCopy(szParam,COUNTOF(szParam),lpstrFile); //GetShortPathName(szParam,szParam,sizeof(WCHAR)*COUNTOF(szParam)); PathQuoteSpaces(szParam); - - CoInitializeEx(NULL,COINIT_APARTMENTTHREADED | COINIT_SPEED_OVER_MEMORY); result = ShellExecuteEx(&sei); } @@ -686,16 +678,12 @@ BOOL OpenWithDlg(HWND hwnd,LPCWSTR lpstrFile) // FavoritesDlgProc() // extern WCHAR tchFavoritesDir[MAX_PATH]; -//extern int flagNoFadeHidden; extern int cxFavoritesDlg; extern int cyFavoritesDlg; INT_PTR CALLBACK FavoritesDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) { - - static HWND hwndLV; - switch(umsg) { @@ -844,6 +832,7 @@ BOOL FavoritesDlg(HWND hwnd,LPWSTR lpstrFile) { DLITEM dliFavorite; + ZeroMemory(&dliFavorite, sizeof(DLITEM)); dliFavorite.mask = DLI_FILENAME; if (IDOK == ThemedDialogBoxParam(g_hInstance,MAKEINTRESOURCE(IDD_FAVORITES), @@ -852,9 +841,7 @@ BOOL FavoritesDlg(HWND hwnd,LPWSTR lpstrFile) StringCchCopyN(lpstrFile,MAX_PATH,dliFavorite.szFileName,MAX_PATH); return(TRUE); } - return(FALSE); - } @@ -968,6 +955,7 @@ extern int flagNoFadeHidden; typedef struct tagIconThreadInfo { HWND hwnd; // HWND of ListView Control + HANDLE hThread; // Thread Handle HANDLE hExitThread; // Flag is set when Icon Thread should terminate HANDLE hTerminatedThread; // Flag is set when Icon Thread has terminated @@ -975,32 +963,33 @@ typedef struct tagIconThreadInfo DWORD WINAPI FileMRUIconThread(LPVOID lpParam) { - HWND hwnd; - LPICONTHREADINFO lpit; - LV_ITEM lvi; WCHAR tch[MAX_PATH] = { L'\0' }; - SHFILEINFO shfi; DWORD dwFlags = SHGFI_SMALLICON | SHGFI_SYSICONINDEX | SHGFI_ATTRIBUTES | SHGFI_ATTR_SPECIFIED; - DWORD dwAttr = 0; - int iItem = 0; - int iMaxItem; - lpit = (LPICONTHREADINFO)lpParam; + LPICONTHREADINFO lpit = (LPICONTHREADINFO)lpParam; ResetEvent(lpit->hTerminatedThread); - hwnd = lpit->hwnd; - iMaxItem = ListView_GetItemCount(hwnd); + HWND hwnd = lpit->hwnd; + int iMaxItem = ListView_GetItemCount(hwnd); - CoInitialize(NULL); - - ZeroMemory(&lvi,sizeof(LV_ITEM)); + CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_SPEED_OVER_MEMORY); + int iItem = 0; while (iItem < iMaxItem && WaitForSingleObject(lpit->hExitThread,0) != WAIT_OBJECT_0) { + LV_ITEM lvi; + ZeroMemory(&lvi, sizeof(LV_ITEM)); + lvi.mask = LVIF_TEXT; lvi.pszText = tch; lvi.cchTextMax = COUNTOF(tch); lvi.iItem = iItem; + + SHFILEINFO shfi; + ZeroMemory(&shfi, sizeof(SHFILEINFO)); + + DWORD dwAttr = 0; + if (ListView_GetItem(hwnd,&lvi)) { if (PathIsUNC(tch) || !PathFileExists(tch)) { @@ -1054,6 +1043,8 @@ DWORD WINAPI FileMRUIconThread(LPVOID lpParam) { CoUninitialize(); SetEvent(lpit->hTerminatedThread); + lpit->hThread = NULL; + ExitThread(0); //return(0); } @@ -1069,9 +1060,10 @@ INT_PTR CALLBACK FileMRUDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) SHFILEINFO shfi; LVCOLUMN lvc = { LVCF_FMT|LVCF_TEXT, LVCFMT_LEFT, 0, L"", -1, 0, 0, 0 }; - LPICONTHREADINFO lpit = (LPVOID)GlobalAlloc(GPTR,sizeof(ICONTHREADINFO)); + LPICONTHREADINFO lpit = (LPICONTHREADINFO)GlobalAlloc(GPTR,sizeof(ICONTHREADINFO)); SetProp(hwnd,L"it",(HANDLE)lpit); lpit->hwnd = GetDlgItem(hwnd,IDC_FILEMRU); + lpit->hThread = NULL; lpit->hExitThread = CreateEvent(NULL,TRUE,FALSE,NULL); lpit->hTerminatedThread = CreateEvent(NULL,TRUE,TRUE,NULL); @@ -1120,6 +1112,7 @@ INT_PTR CALLBACK FileMRUDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) } CloseHandle(lpit->hExitThread); CloseHandle(lpit->hTerminatedThread); + lpit->hThread = NULL; RemoveProp(hwnd,L"it"); GlobalFree(lpit); @@ -1274,6 +1267,7 @@ INT_PTR CALLBACK FileMRUDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) } ResetEvent(lpit->hExitThread); SetEvent(lpit->hTerminatedThread); + lpit->hThread = NULL; ListView_DeleteAllItems(GetDlgItem(hwnd,IDC_FILEMRU)); @@ -1297,7 +1291,7 @@ INT_PTR CALLBACK FileMRUDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPARAM lParam) ListView_SetItemState(GetDlgItem(hwnd,IDC_FILEMRU),0,LVIS_FOCUSED,LVIS_FOCUSED); ListView_SetColumnWidth(GetDlgItem(hwnd,IDC_FILEMRU),0,LVSCW_AUTOSIZE_USEHEADER); - CreateThread(NULL,0,FileMRUIconThread,(LPVOID)lpit,0,&dwtid); + lpit->hThread = CreateThread(NULL,0,FileMRUIconThread,(LPVOID)lpit,0,&dwtid); } break; diff --git a/src/Dlapi.c b/src/Dlapi.c index 297a0b2a9..461a02d46 100644 --- a/src/Dlapi.c +++ b/src/Dlapi.c @@ -48,6 +48,7 @@ typedef struct tagDLDATA // dl int iDefIconFolder; // Default Folder Icon int iDefIconFile; // Default File Icon BOOL bNoFadeHidden; // Flag passed from GetDispInfo() + HANDLE hThread; // Thread Handle HANDLE hExitThread; // Flag is set when Icon Thread should terminate HANDLE hTerminatedThread; // Flag is set when Icon Thread has terminated @@ -79,7 +80,7 @@ BOOL DirList_Init(HWND hwnd,LPCWSTR pszHeader) lpdl->cbidl = 0; lpdl->pidl = NULL; lpdl->lpsf = NULL; - StringCchCopy(lpdl->szPath,MAX_PATH,L""); + StringCchCopy(lpdl->szPath,COUNTOF(lpdl->szPath),L""); // Add Imagelists hil = (HIMAGELIST)SHGetFileInfo(L"C:\\",0,&shfi,sizeof(SHFILEINFO), @@ -141,7 +142,6 @@ BOOL DirList_Destroy(HWND hwnd) GlobalFree(lpdl); return FALSE; - } @@ -153,7 +153,6 @@ BOOL DirList_Destroy(HWND hwnd) // BOOL DirList_StartIconThread(HWND hwnd) { - DWORD dwtid; LPDLDATA lpdl = (LPVOID)GetProp(hwnd,pDirListProp); @@ -162,10 +161,14 @@ BOOL DirList_StartIconThread(HWND hwnd) ResetEvent(lpdl->hExitThread); //ResetEvent(lpdl->hTerminatedThread); - CreateThread(NULL,0,DirList_IconThread,(LPVOID)lpdl,0,&dwtid); + lpdl->hThread = CreateThread(NULL, 0, DirList_IconThread, (LPVOID)lpdl, 0, &dwtid); + if (lpdl->hThread == NULL) { + ResetEvent(lpdl->hExitThread); + SetEvent(lpdl->hTerminatedThread); + return FALSE; + } return TRUE; - } @@ -177,8 +180,10 @@ BOOL DirList_StartIconThread(HWND hwnd) // BOOL DirList_TerminateIconThread(HWND hwnd) { + LPDLDATA lpdl = (LPDLDATA)GetProp(hwnd,pDirListProp); - LPDLDATA lpdl = (LPVOID)GetProp(hwnd,pDirListProp); + if (!lpdl->hThread) + return FALSE; SetEvent(lpdl->hExitThread); @@ -194,9 +199,9 @@ BOOL DirList_TerminateIconThread(HWND hwnd) ResetEvent(lpdl->hExitThread); SetEvent(lpdl->hTerminatedThread); + lpdl->hThread = NULL; return TRUE; - } @@ -221,18 +226,17 @@ int DirList_Fill(HWND hwnd,LPCWSTR lpszDir,DWORD grfFlags,LPCWSTR lpszFileSpec, LPENUMIDLIST lpe = NULL; - LV_ITEM lvi; - LPLV_ITEMDATA lplvid; - ULONG chParsed = 0; ULONG dwAttributes = 0; - DL_FILTER dlf; - SHFILEINFO shfi; + // First of all terminate running icon thread + DirList_TerminateIconThread(hwnd); - LPDLDATA lpdl = (LPVOID)GetProp(hwnd,pDirListProp); + LPDLDATA lpdl = (LPDLDATA)GetProp(hwnd,pDirListProp); // Initialize default icons + SHFILEINFO shfi; + ZeroMemory(&shfi, sizeof(shfi)); SHGetFileInfo(L"Icon",FILE_ATTRIBUTE_DIRECTORY,&shfi,sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES | SHGFI_SMALLICON | SHGFI_SYSICONINDEX); lpdl->iDefIconFolder = shfi.iIcon; @@ -241,23 +245,24 @@ int DirList_Fill(HWND hwnd,LPCWSTR lpszDir,DWORD grfFlags,LPCWSTR lpszFileSpec, SHGFI_USEFILEATTRIBUTES | SHGFI_SMALLICON | SHGFI_SYSICONINDEX); lpdl->iDefIconFile = shfi.iIcon; - // First of all terminate running icon thread - DirList_TerminateIconThread(hwnd); - // A Directory is strongly required - if (!lpszDir || !*lpszDir) + if (!lpszDir || !*lpszDir) { return(-1); - - StringCchCopy(lpdl->szPath,MAX_PATH,lpszDir); + } + StringCchCopyN(lpdl->szPath, COUNTOF(lpdl->szPath), lpszDir, MAX_PATH); // Init ListView SendMessage(hwnd,WM_SETREDRAW,0,0); ListView_DeleteAllItems(hwnd); // Init Filter + DL_FILTER dlf; + ZeroMemory(&dlf, sizeof(DL_FILTER)); DirList_CreateFilter(&dlf,lpszFileSpec,bExcludeFilter); // Init lvi + LV_ITEM lvi; + ZeroMemory(&lvi, sizeof(LV_ITEM)); lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; lvi.iItem = 0; lvi.iSubItem = 0; @@ -335,7 +340,7 @@ int DirList_Fill(HWND hwnd,LPCWSTR lpszDir,DWORD grfFlags,LPCWSTR lpszFileSpec, if (DirList_MatchFilter(lpsf,pidlEntry,&dlf)) { - lplvid = CoTaskMemAlloc(sizeof(LV_ITEMDATA)); + LPLV_ITEMDATA lplvid = CoTaskMemAlloc(sizeof(LV_ITEMDATA)); lplvid->pidl = pidlEntry; lplvid->lpsf = lpsf; @@ -393,7 +398,6 @@ int DirList_Fill(HWND hwnd,LPCWSTR lpszDir,DWORD grfFlags,LPCWSTR lpszFileSpec, // Return number of items in the control return (ListView_GetItemCount(hwnd)); - } @@ -405,38 +409,33 @@ int DirList_Fill(HWND hwnd,LPCWSTR lpszDir,DWORD grfFlags,LPCWSTR lpszFileSpec, // DWORD WINAPI DirList_IconThread(LPVOID lpParam) { + if (!lpParam) + return(0); - HWND hwnd; - - LPDLDATA lpdl; - LV_ITEM lvi; - LPLV_ITEMDATA lplvid; - - IShellIcon* lpshi; - - int iItem = 0; - int iMaxItem; - - lpdl = (LPDLDATA)lpParam; + LPDLDATA lpdl = (LPDLDATA)lpParam; ResetEvent(lpdl->hTerminatedThread); // Exit immediately if DirList_Fill() hasn't been called - if (!lpdl->lpsf) { + if (!(lpdl->lpsf)) { SetEvent(lpdl->hTerminatedThread); ExitThread(0); //return(0); } - hwnd = lpdl->hwnd; - iMaxItem = ListView_GetItemCount(hwnd); + HWND hwnd = lpdl->hwnd; + int iMaxItem = ListView_GetItemCount(hwnd); - CoInitialize(NULL); + CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_SPEED_OVER_MEMORY); // Get IShellIcon + IShellIcon* lpshi = NULL; lpdl->lpsf->lpVtbl->QueryInterface(lpdl->lpsf,&IID_IShellIcon,&lpshi); + int iItem = 0; while (iItem < iMaxItem && WaitForSingleObject(lpdl->hExitThread,0) != WAIT_OBJECT_0) { + LV_ITEM lvi = { 0 }; + lvi.iItem = iItem; lvi.mask = LVIF_PARAM; if (ListView_GetItem(hwnd,&lvi)) { @@ -445,7 +444,7 @@ DWORD WINAPI DirList_IconThread(LPVOID lpParam) LPITEMIDLIST pidl; DWORD dwAttributes = SFGAO_LINK | SFGAO_SHARE; - lplvid = (LPLV_ITEMDATA)lvi.lParam; + LPLV_ITEMDATA lplvid = (LPLV_ITEMDATA)lvi.lParam; lvi.mask = LVIF_IMAGE; @@ -511,7 +510,6 @@ DWORD WINAPI DirList_IconThread(LPVOID lpParam) SetEvent(lpdl->hTerminatedThread); ExitThread(0); //return(0); - } @@ -557,18 +555,19 @@ BOOL DirList_GetDispInfo(HWND hwnd,LPARAM lParam,BOOL bNoFadeHidden) // BOOL DirList_DeleteItem(HWND hwnd,LPARAM lParam) { + if (!lParam) + return FALSE; + + LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)lParam; LV_ITEM lvi; - - NM_LISTVIEW *lpnmlv = (LPVOID)lParam; - + ZeroMemory(&lvi, sizeof(LV_ITEM)); lvi.iItem = lpnmlv->iItem; lvi.iSubItem = 0; lvi.mask = LVIF_PARAM; if (ListView_GetItem(hwnd,&lvi)) { - // Free mem LPLV_ITEMDATA lplvid = (LPLV_ITEMDATA)lvi.lParam; CoTaskMemFree(lplvid->pidl); @@ -577,12 +576,9 @@ BOOL DirList_DeleteItem(HWND hwnd,LPARAM lParam) CoTaskMemFree(lplvid); return TRUE; - } - else return FALSE; - } @@ -594,66 +590,40 @@ BOOL DirList_DeleteItem(HWND hwnd,LPARAM lParam) // int CALLBACK DirList_CompareProcFw(LPARAM lp1,LPARAM lp2,LPARAM lFlags) { - - HRESULT hr; - int result; - LPLV_ITEMDATA lplvid1 = (LPLV_ITEMDATA)lp1; LPLV_ITEMDATA lplvid2 = (LPLV_ITEMDATA)lp2; - hr = (lplvid1->lpsf->lpVtbl->CompareIDs( - lplvid1->lpsf, - lFlags, - lplvid1->pidl, - lplvid2->pidl)); + HRESULT hr = (lplvid1->lpsf->lpVtbl->CompareIDs(lplvid1->lpsf,lFlags,lplvid1->pidl,lplvid2->pidl)); - result = (short)(SCODE_CODE(GetScode(hr))); + int result = (short)(SCODE_CODE(GetScode(hr))); if (result != 0 || lFlags == 0) - return(result); + return result; - hr = (lplvid1->lpsf->lpVtbl->CompareIDs( - lplvid1->lpsf, - 0, - lplvid1->pidl, - lplvid2->pidl)); + hr = (lplvid1->lpsf->lpVtbl->CompareIDs(lplvid1->lpsf,0,lplvid1->pidl,lplvid2->pidl)); result = (short)(SCODE_CODE(GetScode(hr))); - return(result); - + return result; } int CALLBACK DirList_CompareProcRw(LPARAM lp1,LPARAM lp2,LPARAM lFlags) { - - HRESULT hr; - int result; - LPLV_ITEMDATA lplvid1 = (LPLV_ITEMDATA)lp1; LPLV_ITEMDATA lplvid2 = (LPLV_ITEMDATA)lp2; - hr = (lplvid1->lpsf->lpVtbl->CompareIDs( - lplvid1->lpsf, - lFlags, - lplvid1->pidl, - lplvid2->pidl)); + HRESULT hr = (lplvid1->lpsf->lpVtbl->CompareIDs(lplvid1->lpsf,lFlags,lplvid1->pidl,lplvid2->pidl)); - result = -(short)(SCODE_CODE(GetScode(hr))); + int result = -(short)(SCODE_CODE(GetScode(hr))); if (result != 0) - return(result); + return result; - hr = (lplvid1->lpsf->lpVtbl->CompareIDs( - lplvid1->lpsf, - 0, - lplvid1->pidl, - lplvid2->pidl)); + hr = (lplvid1->lpsf->lpVtbl->CompareIDs(lplvid1->lpsf,0,lplvid1->pidl,lplvid2->pidl)); result = -(short)(SCODE_CODE(GetScode(hr))); - return(result); - + return result; } @@ -665,13 +635,10 @@ int CALLBACK DirList_CompareProcRw(LPARAM lp1,LPARAM lp2,LPARAM lFlags) // BOOL DirList_Sort(HWND hwnd,int lFlags,BOOL fRev) { - if (fRev) return ListView_SortItems(hwnd,DirList_CompareProcRw,lFlags); - else return ListView_SortItems(hwnd,DirList_CompareProcFw,lFlags); - } @@ -683,39 +650,29 @@ BOOL DirList_Sort(HWND hwnd,int lFlags,BOOL fRev) // int DirList_GetItem(HWND hwnd,int iItem,LPDLITEM lpdli) { - - LV_ITEM lvi; - LPLV_ITEMDATA lplvid; - if (iItem == -1) { - if (ListView_GetSelectedCount(hwnd)) - iItem = ListView_GetNextItem(hwnd,-1,LVNI_ALL | LVNI_SELECTED); - else - return(-1); - } + LV_ITEM lvi; + ZeroMemory(&lvi, sizeof(LV_ITEM)); lvi.mask = LVIF_PARAM; lvi.iItem = iItem; lvi.iSubItem = 0; if (!ListView_GetItem(hwnd,&lvi)) { - if (lpdli->mask & DLI_TYPE) - lpdli->ntype = DLE_NONE; return(-1); - } - lplvid = (LPLV_ITEMDATA)lvi.lParam; + LPLV_ITEMDATA lplvid = (LPLV_ITEMDATA)lvi.lParam; // Filename if (lpdli->mask & DLI_FILENAME) @@ -756,7 +713,6 @@ int DirList_GetItem(HWND hwnd,int iItem,LPDLITEM lpdli) } return iItem; - } diff --git a/src/Helpers.c b/src/Helpers.c index eadfe8979..862887a46 100644 --- a/src/Helpers.c +++ b/src/Helpers.c @@ -1034,6 +1034,26 @@ int FormatString(LPWSTR lpOutput,int nOutput,UINT uIdFormat,...) } +//============================================================================= +// +// GetKnownFolderPath() +// +BOOL GetKnownFolderPath(REFKNOWNFOLDERID rfid, LPWSTR lpOutPath, size_t cchCount) +{ + //const DWORD dwFlags = (KF_FLAG_DEFAULT_PATH | KF_FLAG_NOT_PARENT_RELATIVE | KF_FLAG_NO_ALIAS); + const DWORD dwFlags = KF_FLAG_NO_ALIAS; + + PWSTR pszPath = NULL; + HRESULT hr = SHGetKnownFolderPath(rfid, dwFlags, NULL, &pszPath); + if (SUCCEEDED(hr) && pszPath) { + StringCchCopy(lpOutPath, cchCount, pszPath); + CoTaskMemFree(pszPath); + return TRUE; + } + return FALSE; +} + + //============================================================================= // // PathRelativeToApp() @@ -1053,7 +1073,8 @@ void PathRelativeToApp( PathCanonicalizeEx(wchAppPath,MAX_PATH); PathCchRemoveFileSpec(wchAppPath,COUNTOF(wchAppPath)); GetWindowsDirectory(wchWinDir,COUNTOF(wchWinDir)); - SHGetFolderPath(NULL,CSIDL_PERSONAL,NULL,SHGFP_TYPE_CURRENT,wchUserFiles); + //SHGetFolderPath(NULL,CSIDL_PERSONAL,NULL,SHGFP_TYPE_CURRENT,wchUserFiles); + GetKnownFolderPath(&FOLDERID_Documents, wchUserFiles, COUNTOF(wchUserFiles)); if (bUnexpandMyDocs && !PathIsRelative(lpszSrc) && @@ -1101,7 +1122,8 @@ void PathAbsoluteFromApp(LPWSTR lpszSrc,LPWSTR lpszDest,int cchDest,BOOL bExpand } if (StrCmpNI(lpszSrc,L"%CSIDL:MYDOCUMENTS%",CSTRLEN("%CSIDL:MYDOCUMENTS%")) == 0) { - SHGetFolderPath(NULL,CSIDL_PERSONAL,NULL,SHGFP_TYPE_CURRENT,wchPath); + //SHGetFolderPath(NULL,CSIDL_PERSONAL,NULL,SHGFP_TYPE_CURRENT,wchPath); + GetKnownFolderPath(&FOLDERID_Documents, wchPath, COUNTOF(wchPath)); PathCchAppend(wchPath,COUNTOF(wchPath),lpszSrc+CSTRLEN("%CSIDL:MYDOCUMENTS%")); } else { @@ -1283,7 +1305,8 @@ BOOL PathCreateDeskLnk(LPCWSTR pszDocument) StringCchCopy(tchArguments,COUNTOF(tchArguments),L"-n "); StringCchCat(tchArguments,COUNTOF(tchArguments),tchDocTemp); - SHGetSpecialFolderPath(NULL,tchLinkDir,CSIDL_DESKTOPDIRECTORY,TRUE); + //SHGetSpecialFolderPath(NULL,tchLinkDir,CSIDL_DESKTOPDIRECTORY,TRUE); + GetKnownFolderPath(&FOLDERID_Desktop, tchLinkDir, COUNTOF(tchLinkDir)); GetString(IDS_LINKDESCRIPTION,tchDescription,COUNTOF(tchDescription)); diff --git a/src/Helpers.h b/src/Helpers.h index d7202a704..005e61951 100644 --- a/src/Helpers.h +++ b/src/Helpers.h @@ -159,7 +159,7 @@ BOOL IsCmdEnabled(HWND, UINT); int FormatString(LPWSTR,int,UINT,...); - +BOOL GetKnownFolderPath(REFKNOWNFOLDERID, LPWSTR, size_t); void PathRelativeToApp(LPWSTR,LPWSTR,int,BOOL,BOOL,BOOL); void PathAbsoluteFromApp(LPWSTR,LPWSTR,int,BOOL); diff --git a/src/Notepad3.c b/src/Notepad3.c index 0bcbad649..32a823124 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -2601,7 +2601,6 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) sei.lpParameters = tchParam; sei.lpDirectory = NULL; sei.nShow = SW_SHOWNORMAL; - CoInitializeEx(NULL,COINIT_APARTMENTTHREADED | COINIT_SPEED_OVER_MEMORY); ShellExecuteEx(&sei); if ((INT_PTR)sei.hInstApp < 32) @@ -2672,7 +2671,6 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) sei.lpParameters = szParameters; sei.lpDirectory = g_wchWorkingDirectory; sei.nShow = SW_SHOWNORMAL; - CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_SPEED_OVER_MEMORY); ShellExecuteEx(&sei); } break; @@ -2703,7 +2701,6 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) sei.lpParameters = NULL; sei.lpDirectory = wchDirectory; sei.nShow = SW_SHOWNORMAL; - CoInitializeEx(NULL,COINIT_APARTMENTTHREADED | COINIT_SPEED_OVER_MEMORY); ShellExecuteEx(&sei); } break; @@ -2772,7 +2769,6 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) sei.lpVerb = L"properties"; sei.lpFile = szCurFile; sei.nShow = SW_SHOWNORMAL; - CoInitializeEx(NULL,COINIT_APARTMENTTHREADED | COINIT_SPEED_OVER_MEMORY); ShellExecuteEx(&sei); } break; @@ -2834,7 +2830,6 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) sei.lpDirectory = NULL; sei.nShow = SW_SHOWNORMAL; // Run favorites directory - CoInitializeEx(NULL,COINIT_APARTMENTTHREADED | COINIT_SPEED_OVER_MEMORY); ShellExecuteEx(&sei); } break; @@ -4938,7 +4933,6 @@ LRESULT MsgCommand(HWND hwnd,WPARAM wParam,LPARAM lParam) sei.lpParameters = lpszArgs; sei.lpDirectory = wchDirectory; sei.nShow = SW_SHOWNORMAL; - CoInitializeEx(NULL,COINIT_APARTMENTTHREADED | COINIT_SPEED_OVER_MEMORY); ShellExecuteEx(&sei); GlobalFree(lpszCommand); @@ -5816,17 +5810,20 @@ void LoadSettings() efrData.fuFlags = IniSectionGetUInt(pIniSection, L"efrData_fuFlags", 0); - if (!IniSectionGetString(pIniSection,L"OpenWithDir",L"", - tchOpenWithDir,COUNTOF(tchOpenWithDir))) - SHGetSpecialFolderPath(NULL,tchOpenWithDir,CSIDL_DESKTOPDIRECTORY,TRUE); - else - PathAbsoluteFromApp(tchOpenWithDir,NULL,COUNTOF(tchOpenWithDir),TRUE); - - if (!IniSectionGetString(pIniSection,L"Favorites",L"", - tchFavoritesDir,COUNTOF(tchFavoritesDir))) - SHGetFolderPath(NULL,CSIDL_PERSONAL,NULL,SHGFP_TYPE_CURRENT,tchFavoritesDir); - else - PathAbsoluteFromApp(tchFavoritesDir,NULL,COUNTOF(tchFavoritesDir),TRUE); + if (!IniSectionGetString(pIniSection, L"OpenWithDir", L"", tchOpenWithDir, COUNTOF(tchOpenWithDir))) { + //SHGetSpecialFolderPath(NULL, tchOpenWithDir, CSIDL_DESKTOPDIRECTORY, TRUE); + GetKnownFolderPath(&FOLDERID_Desktop, tchOpenWithDir, COUNTOF(tchOpenWithDir)); + } + else { + PathAbsoluteFromApp(tchOpenWithDir, NULL, COUNTOF(tchOpenWithDir), TRUE); + } + if (!IniSectionGetString(pIniSection, L"Favorites", L"", tchFavoritesDir, COUNTOF(tchFavoritesDir))) { + //SHGetFolderPath(NULL,CSIDL_PERSONAL,NULL,SHGFP_TYPE_CURRENT,tchFavoritesDir); + GetKnownFolderPath(&FOLDERID_Favorites, tchFavoritesDir, COUNTOF(tchFavoritesDir)); + } + else { + PathAbsoluteFromApp(tchFavoritesDir, NULL, COUNTOF(tchFavoritesDir), TRUE); + } iPathNameFormat = IniSectionGetInt(pIniSection,L"PathNameFormat",0); iPathNameFormat = max(min(iPathNameFormat,2),0); @@ -6767,7 +6764,8 @@ int CheckIniFile(LPWSTR lpszFile,LPCWSTR lpszModule) return(1); } // %appdata% - if (S_OK == SHGetFolderPath(NULL,CSIDL_APPDATA,NULL,SHGFP_TYPE_CURRENT,tchBuild)) { + //if (S_OK == SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, tchBuild)) { + if (GetKnownFolderPath(&FOLDERID_RoamingAppData, tchBuild, COUNTOF(tchBuild))) { PathCchAppend(tchBuild,COUNTOF(tchBuild),tchFileExpanded); if (PathFileExists(tchBuild)) { StringCchCopy(lpszFile,MAX_PATH,tchBuild); @@ -8312,7 +8310,6 @@ BOOL RelaunchElevated(LPWSTR lpArgs) { sei.lpParameters = szArguments; sei.lpDirectory = g_wchWorkingDirectory; sei.nShow = si.wShowWindow ? si.wShowWindow : SW_SHOWNORMAL; - CoInitializeEx(NULL,COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE | COINIT_SPEED_OVER_MEMORY); result = ShellExecuteEx(&sei); } From 05c792763452029b433bebb21466ca2dc7ca2e5c Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Tue, 17 Oct 2017 14:08:55 +0200 Subject: [PATCH 2/2] + add code snippet (activation only prepare for future extensions) --- src/Helpers.c | 36 ++++++++++++++++++++++++++++++++++++ src/Helpers.h | 1 + 2 files changed, 37 insertions(+) diff --git a/src/Helpers.c b/src/Helpers.c index 862887a46..4bb8de5b1 100644 --- a/src/Helpers.c +++ b/src/Helpers.c @@ -608,6 +608,7 @@ void CenterDlgInParent(HWND hDlg) SetWindowPos(hDlg,NULL,max(xMin,min(xMax,x)),max(yMin,min(yMax,y)),0,0,SWP_NOZORDER|SWP_NOSIZE); + //SnapToDefaultButton(hDlg); } @@ -672,6 +673,41 @@ void SetDlgPos(HWND hDlg,int xDlg,int yDlg) } +/* + + ... only if we are working with nonstandard dialog boxes ... + +//============================================================================= +// +// SnapToDefaultButton() +// +// Why doesn't the "Automatically move pointer to the default button in a dialog box" +// work for nonstandard dialog boxes, and how do I add it to my own nonstandard dialog boxes? +// https://blogs.msdn.microsoft.com/oldnewthing/20130826-00/?p=3413/ +// +void SnapToDefaultButton(HWND hwndBox) +{ + BOOL bSnapToDefButton = FALSE; + if (SystemParametersInfo(SPI_GETSNAPTODEFBUTTON, 0, &bSnapToDefButton, 0) && bSnapToDefButton) { + // get child window at the top of the Z order. + // for all our MessageBoxs it's the OK or YES button or NULL. + HWND btn = GetWindow(hwndBox, GW_CHILD); + if (btn != NULL) { + WCHAR className[32] = L""; + GetClassName(btn, className, COUNTOF(className)); + if (lstrcmpi(className, L"Button") == 0) { + RECT rect; + int x, y; + GetWindowRect(btn, &rect); + x = rect.left + (rect.right - rect.left) / 2; + y = rect.top + (rect.bottom - rect.top) / 2; + SetCursorPos(x, y); + } + } + } +} +*/ + //============================================================================= // diff --git a/src/Helpers.h b/src/Helpers.h index 005e61951..240b6af9f 100644 --- a/src/Helpers.h +++ b/src/Helpers.h @@ -125,6 +125,7 @@ void SetWindowTransparentMode(HWND,BOOL); void CenterDlgInParent(HWND); void GetDlgPos(HWND,LPINT,LPINT); void SetDlgPos(HWND,int,int); +//void SnapToDefaultButton(HWND); void ResizeDlg_Init(HWND,int,int,int); void ResizeDlg_Destroy(HWND,int*,int*); void ResizeDlg_Size(HWND,LPARAM,int*,int*);