mirror of
https://github.com/rizonesoft/Notepad3.git
synced 2026-06-14 21:09:05 +08:00
Merge pull request #132 from RaiKoHoff/Changes_610+
fixes crash in Favorites Management
This commit is contained in:
commit
75cd98a9d8
@ -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;
|
||||
|
||||
|
||||
154
src/Dlapi.c
154
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;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
//=============================================================================
|
||||
//
|
||||
@ -1034,6 +1070,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 +1109,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 +1158,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 +1341,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));
|
||||
|
||||
|
||||
@ -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*);
|
||||
@ -159,7 +160,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);
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user