Merge pull request #132 from RaiKoHoff/Changes_610+

fixes crash in Favorites Management
This commit is contained in:
Derick Payne 2017-10-17 16:57:55 +02:00 committed by GitHub
commit 75cd98a9d8
5 changed files with 164 additions and 157 deletions

View File

@ -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;

View File

@ -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;
}

View File

@ -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));

View File

@ -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);

View File

@ -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);
}