Split up the window procedure.
This commit is contained in:
parent
abe70f7648
commit
95a58eba7d
|
@ -41,6 +41,14 @@ static HWND hwndTreeView;
|
||||||
static LPBROWSEINFOW lpBrowseInfo;
|
static LPBROWSEINFOW lpBrowseInfo;
|
||||||
static LPITEMIDLIST pidlRet;
|
static LPITEMIDLIST pidlRet;
|
||||||
|
|
||||||
|
typedef struct tagID
|
||||||
|
{
|
||||||
|
LPSHELLFOLDER lpsfParent; /* IShellFolder of the parent */
|
||||||
|
LPITEMIDLIST lpi; /* PIDL relativ to parent */
|
||||||
|
LPITEMIDLIST lpifq; /* Fully qualified PIDL */
|
||||||
|
IEnumIDList* pEnumIL; /* Children iterator */
|
||||||
|
} TV_ITEMDATA, *LPTV_ITEMDATA;
|
||||||
|
|
||||||
static void FillTreeView(LPSHELLFOLDER lpsf, LPITEMIDLIST lpifq, HTREEITEM hParent, IEnumIDList* lpe);
|
static void FillTreeView(LPSHELLFOLDER lpsf, LPITEMIDLIST lpifq, HTREEITEM hParent, IEnumIDList* lpe);
|
||||||
static HTREEITEM InsertTreeViewItem(IShellFolder * lpsf, LPCITEMIDLIST pidl, LPCITEMIDLIST pidlParent, IEnumIDList* pEnumIL, HTREEITEM hParent);
|
static HTREEITEM InsertTreeViewItem(IShellFolder * lpsf, LPCITEMIDLIST pidl, LPCITEMIDLIST pidlParent, IEnumIDList* pEnumIL, HTREEITEM hParent);
|
||||||
|
|
||||||
|
@ -174,14 +182,6 @@ static void GetNormalAndSelectedIcons(LPITEMIDLIST lpifq, LPTVITEMW lpTV_ITEM)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct tagID
|
|
||||||
{
|
|
||||||
LPSHELLFOLDER lpsfParent; /* IShellFolder of the parent */
|
|
||||||
LPITEMIDLIST lpi; /* PIDL relativ to parent */
|
|
||||||
LPITEMIDLIST lpifq; /* Fully qualified PIDL */
|
|
||||||
IEnumIDList* pEnumIL; /* Children iterator */
|
|
||||||
} TV_ITEMDATA, *LPTV_ITEMDATA;
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* GetName [Internal]
|
* GetName [Internal]
|
||||||
*
|
*
|
||||||
|
@ -347,177 +347,220 @@ static void BrsFolder_CheckValidSelection(HWND hWndTree, LPTV_ITEMDATA lptvid)
|
||||||
LPCITEMIDLIST pidl = lptvid->lpi;
|
LPCITEMIDLIST pidl = lptvid->lpi;
|
||||||
BOOL bEnabled = TRUE;
|
BOOL bEnabled = TRUE;
|
||||||
DWORD dwAttributes;
|
DWORD dwAttributes;
|
||||||
|
HRESULT r;
|
||||||
|
|
||||||
if ((lpBrowseInfo->ulFlags & BIF_BROWSEFORCOMPUTER) &&
|
if ((lpBrowseInfo->ulFlags & BIF_BROWSEFORCOMPUTER) &&
|
||||||
!PIDLIsType(pidl, PT_COMP))
|
!PIDLIsType(pidl, PT_COMP))
|
||||||
bEnabled = FALSE;
|
bEnabled = FALSE;
|
||||||
if (lpBrowseInfo->ulFlags & BIF_RETURNFSANCESTORS)
|
if (lpBrowseInfo->ulFlags & BIF_RETURNFSANCESTORS)
|
||||||
{
|
{
|
||||||
dwAttributes = SFGAO_FILESYSANCESTOR | SFGAO_FILESYSTEM;
|
dwAttributes = SFGAO_FILESYSANCESTOR | SFGAO_FILESYSTEM;
|
||||||
if (FAILED(IShellFolder_GetAttributesOf(lptvid->lpsfParent, 1, (LPCITEMIDLIST*)&lptvid->lpi, &dwAttributes)) ||
|
r = IShellFolder_GetAttributesOf(lptvid->lpsfParent, 1,
|
||||||
!dwAttributes)
|
(LPCITEMIDLIST*)&lptvid->lpi, &dwAttributes);
|
||||||
|
if (FAILED(r) || !dwAttributes)
|
||||||
bEnabled = FALSE;
|
bEnabled = FALSE;
|
||||||
}
|
}
|
||||||
if (lpBrowseInfo->ulFlags & BIF_RETURNONLYFSDIRS)
|
if (lpBrowseInfo->ulFlags & BIF_RETURNONLYFSDIRS)
|
||||||
{
|
{
|
||||||
dwAttributes = SFGAO_FOLDER | SFGAO_FILESYSTEM;
|
dwAttributes = SFGAO_FOLDER | SFGAO_FILESYSTEM;
|
||||||
if (FAILED(IShellFolder_GetAttributesOf(lptvid->lpsfParent, 1, (LPCITEMIDLIST*)&lptvid->lpi, &dwAttributes)) ||
|
r = IShellFolder_GetAttributesOf(lptvid->lpsfParent, 1,
|
||||||
(dwAttributes != (SFGAO_FOLDER | SFGAO_FILESYSTEM)))
|
(LPCITEMIDLIST*)&lptvid->lpi, &dwAttributes);
|
||||||
|
if (FAILED(r) || (dwAttributes != (SFGAO_FOLDER | SFGAO_FILESYSTEM)))
|
||||||
bEnabled = FALSE;
|
bEnabled = FALSE;
|
||||||
}
|
}
|
||||||
SendMessageW(hWndTree, BFFM_ENABLEOK, 0, (LPARAM)bEnabled);
|
SendMessageW(hWndTree, BFFM_ENABLEOK, 0, (LPARAM)bEnabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
static LRESULT MsgNotify(HWND hWnd, UINT CtlID, LPNMHDR lpnmh)
|
static LRESULT BrsFolder_Treeview_Delete( NMTREEVIEWW *pnmtv )
|
||||||
{
|
{
|
||||||
NMTREEVIEWW *pnmtv = (NMTREEVIEWW *)lpnmh;
|
LPTV_ITEMDATA lptvid = (LPTV_ITEMDATA)pnmtv->itemOld.lParam;
|
||||||
LPTV_ITEMDATA lptvid; /* Long pointer to TreeView item data */
|
|
||||||
IShellFolder * lpsf2=0;
|
|
||||||
|
|
||||||
|
TRACE("TVN_DELETEITEMA/W %p\n", lptvid);
|
||||||
|
|
||||||
TRACE("%p %x %p msg=%x\n", hWnd, CtlID, lpnmh, pnmtv->hdr.code);
|
IShellFolder_Release(lptvid->lpsfParent);
|
||||||
|
if (lptvid->pEnumIL)
|
||||||
switch (pnmtv->hdr.idFrom)
|
IEnumIDList_Release(lptvid->pEnumIL);
|
||||||
{ case IDD_TREEVIEW:
|
SHFree(lptvid->lpi);
|
||||||
switch (pnmtv->hdr.code)
|
SHFree(lptvid->lpifq);
|
||||||
{
|
SHFree(lptvid);
|
||||||
case TVN_DELETEITEMA:
|
return 0;
|
||||||
case TVN_DELETEITEMW:
|
|
||||||
TRACE("TVN_DELETEITEMA/W\n");
|
|
||||||
lptvid=(LPTV_ITEMDATA)pnmtv->itemOld.lParam;
|
|
||||||
IShellFolder_Release(lptvid->lpsfParent);
|
|
||||||
if (lptvid->pEnumIL)
|
|
||||||
IEnumIDList_Release(lptvid->pEnumIL);
|
|
||||||
SHFree(lptvid->lpi);
|
|
||||||
SHFree(lptvid->lpifq);
|
|
||||||
SHFree(lptvid);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TVN_ITEMEXPANDINGA:
|
|
||||||
case TVN_ITEMEXPANDINGW:
|
|
||||||
{
|
|
||||||
TRACE("TVN_ITEMEXPANDINGA/W\n");
|
|
||||||
if ((pnmtv->itemNew.state & TVIS_EXPANDEDONCE))
|
|
||||||
break;
|
|
||||||
|
|
||||||
lptvid=(LPTV_ITEMDATA)pnmtv->itemNew.lParam;
|
|
||||||
if (SUCCEEDED(IShellFolder_BindToObject(lptvid->lpsfParent, lptvid->lpi,0,(REFIID)&IID_IShellFolder,(LPVOID *)&lpsf2)))
|
|
||||||
{ FillTreeView( lpsf2, lptvid->lpifq, pnmtv->itemNew.hItem, lptvid->pEnumIL);
|
|
||||||
}
|
|
||||||
/* My Computer is already sorted and trying to do a simple text
|
|
||||||
* sort will only mess things up */
|
|
||||||
if (!_ILIsMyComputer(lptvid->lpi))
|
|
||||||
TreeView_SortChildren(hwndTreeView, pnmtv->itemNew.hItem, FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case TVN_SELCHANGEDA:
|
|
||||||
case TVN_SELCHANGEDW:
|
|
||||||
lptvid=(LPTV_ITEMDATA)pnmtv->itemNew.lParam;
|
|
||||||
pidlRet = lptvid->lpifq;
|
|
||||||
if (lpBrowseInfo->lpfn)
|
|
||||||
(lpBrowseInfo->lpfn)(hWnd, BFFM_SELCHANGED, (LPARAM)pidlRet, lpBrowseInfo->lParam);
|
|
||||||
BrsFolder_CheckValidSelection(hWnd, lptvid);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
WARN("unhandled (%d)\n", pnmtv->hdr.code);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static LRESULT BrsFolder_Treeview_Expand( NMTREEVIEWW *pnmtv )
|
||||||
|
{
|
||||||
|
IShellFolder *lpsf2 = NULL;
|
||||||
|
LPTV_ITEMDATA lptvid = (LPTV_ITEMDATA) pnmtv->itemNew.lParam;
|
||||||
|
HRESULT r;
|
||||||
|
|
||||||
|
TRACE("TVN_ITEMEXPANDINGA/W\n");
|
||||||
|
|
||||||
|
if ((pnmtv->itemNew.state & TVIS_EXPANDEDONCE))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
r = IShellFolder_BindToObject( lptvid->lpsfParent, lptvid->lpi, 0,
|
||||||
|
(REFIID)&IID_IShellFolder, (LPVOID *)&lpsf2 );
|
||||||
|
if (SUCCEEDED(r))
|
||||||
|
FillTreeView( lpsf2, lptvid->lpifq, pnmtv->itemNew.hItem, lptvid->pEnumIL);
|
||||||
|
|
||||||
|
/* My Computer is already sorted and trying to do a simple text
|
||||||
|
* sort will only mess things up */
|
||||||
|
if (!_ILIsMyComputer(lptvid->lpi))
|
||||||
|
TreeView_SortChildren(hwndTreeView, pnmtv->itemNew.hItem, FALSE);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT BrsFolder_Treeview_Changed( HWND hWnd, NMTREEVIEWW *pnmtv )
|
||||||
|
{
|
||||||
|
LPTV_ITEMDATA lptvid = (LPTV_ITEMDATA) pnmtv->itemNew.lParam;
|
||||||
|
|
||||||
|
lptvid = (LPTV_ITEMDATA) pnmtv->itemNew.lParam;
|
||||||
|
pidlRet = lptvid->lpifq;
|
||||||
|
if (lpBrowseInfo->lpfn)
|
||||||
|
(lpBrowseInfo->lpfn)(hWnd, BFFM_SELCHANGED, (LPARAM)pidlRet, lpBrowseInfo->lParam);
|
||||||
|
BrsFolder_CheckValidSelection(hWnd, lptvid);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static LRESULT BrsFolder_OnNotify( HWND hWnd, UINT CtlID, LPNMHDR lpnmh )
|
||||||
|
{
|
||||||
|
NMTREEVIEWW *pnmtv = (NMTREEVIEWW *)lpnmh;
|
||||||
|
|
||||||
|
TRACE("%p %x %p msg=%x\n", hWnd, CtlID, lpnmh, pnmtv->hdr.code);
|
||||||
|
|
||||||
|
if (pnmtv->hdr.idFrom != IDD_TREEVIEW)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
switch (pnmtv->hdr.code)
|
||||||
|
{
|
||||||
|
case TVN_DELETEITEMA:
|
||||||
|
case TVN_DELETEITEMW:
|
||||||
|
return BrsFolder_Treeview_Delete( pnmtv );
|
||||||
|
|
||||||
|
case TVN_ITEMEXPANDINGA:
|
||||||
|
case TVN_ITEMEXPANDINGW:
|
||||||
|
return BrsFolder_Treeview_Expand( pnmtv );
|
||||||
|
|
||||||
|
case TVN_SELCHANGEDA:
|
||||||
|
case TVN_SELCHANGEDW:
|
||||||
|
return BrsFolder_Treeview_Changed( hWnd, pnmtv );
|
||||||
|
|
||||||
|
default:
|
||||||
|
WARN("unhandled (%d)\n", pnmtv->hdr.code);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static BOOL BrsFolder_OnCreate( HWND hWnd, LPBROWSEINFOW lpbi )
|
||||||
|
{
|
||||||
|
pidlRet = NULL;
|
||||||
|
lpBrowseInfo = lpbi;
|
||||||
|
|
||||||
|
if (lpBrowseInfo->ulFlags & ~SUPPORTEDFLAGS)
|
||||||
|
FIXME("flags %x not implemented\n", lpBrowseInfo->ulFlags & ~SUPPORTEDFLAGS);
|
||||||
|
|
||||||
|
if (lpBrowseInfo->lpszTitle)
|
||||||
|
SetWindowTextW( GetDlgItem(hWnd, IDD_TITLE), lpBrowseInfo->lpszTitle );
|
||||||
|
else
|
||||||
|
ShowWindow( GetDlgItem(hWnd, IDD_TITLE), SW_HIDE );
|
||||||
|
|
||||||
|
if (!(lpBrowseInfo->ulFlags & BIF_STATUSTEXT))
|
||||||
|
ShowWindow( GetDlgItem(hWnd, IDD_STATUS), SW_HIDE );
|
||||||
|
|
||||||
|
InitializeTreeView( hWnd, lpBrowseInfo->pidlRoot );
|
||||||
|
|
||||||
|
if (lpBrowseInfo->lpfn)
|
||||||
|
(lpBrowseInfo->lpfn)( hWnd, BFFM_INITIALIZED, 0, lpBrowseInfo->lParam );
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL BrsFolder_OnCommand( HWND hWnd, UINT id )
|
||||||
|
{
|
||||||
|
switch (id)
|
||||||
|
{
|
||||||
|
case IDOK:
|
||||||
|
pdump( pidlRet );
|
||||||
|
if (lpBrowseInfo->pszDisplayName)
|
||||||
|
SHGetPathFromIDListW( pidlRet, lpBrowseInfo->pszDisplayName );
|
||||||
|
EndDialog(hWnd, (DWORD) ILClone(pidlRet));
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
case IDCANCEL:
|
||||||
|
EndDialog(hWnd, 0);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* BrsFolderDlgProc32 (not an exported API function)
|
* BrsFolderDlgProc32 (not an exported API function)
|
||||||
*/
|
*/
|
||||||
static INT_PTR CALLBACK BrsFolderDlgProc(HWND hWnd, UINT msg, WPARAM wParam,
|
static INT_PTR CALLBACK BrsFolderDlgProc( HWND hWnd, UINT msg, WPARAM wParam,
|
||||||
LPARAM lParam )
|
LPARAM lParam )
|
||||||
{
|
{
|
||||||
TRACE("hwnd=%p msg=%04x 0x%08x 0x%08lx\n", hWnd, msg, wParam, lParam );
|
TRACE("hwnd=%p msg=%04x 0x%08x 0x%08lx\n", hWnd, msg, wParam, lParam );
|
||||||
|
|
||||||
switch(msg)
|
if (msg == WM_INITDIALOG)
|
||||||
{ case WM_INITDIALOG:
|
return BrsFolder_OnCreate( hWnd, (LPBROWSEINFOW) lParam );
|
||||||
pidlRet = NULL;
|
|
||||||
lpBrowseInfo = (LPBROWSEINFOW) lParam;
|
|
||||||
if (lpBrowseInfo->ulFlags & ~SUPPORTEDFLAGS)
|
|
||||||
FIXME("flags %x not implemented\n", lpBrowseInfo->ulFlags & ~SUPPORTEDFLAGS);
|
|
||||||
if (lpBrowseInfo->lpszTitle) {
|
|
||||||
SetWindowTextW(GetDlgItem(hWnd, IDD_TITLE), lpBrowseInfo->lpszTitle);
|
|
||||||
} else {
|
|
||||||
ShowWindow(GetDlgItem(hWnd, IDD_TITLE), SW_HIDE);
|
|
||||||
}
|
|
||||||
if (!(lpBrowseInfo->ulFlags & BIF_STATUSTEXT))
|
|
||||||
ShowWindow(GetDlgItem(hWnd, IDD_STATUS), SW_HIDE);
|
|
||||||
|
|
||||||
InitializeTreeView(hWnd, lpBrowseInfo->pidlRoot);
|
switch (msg)
|
||||||
|
{
|
||||||
|
case WM_NOTIFY:
|
||||||
|
return BrsFolder_OnNotify( hWnd, (UINT)wParam, (LPNMHDR)lParam);
|
||||||
|
|
||||||
if (lpBrowseInfo->lpfn)
|
case WM_COMMAND:
|
||||||
(lpBrowseInfo->lpfn)(hWnd, BFFM_INITIALIZED, 0, lpBrowseInfo->lParam);
|
return BrsFolder_OnCommand( hWnd, wParam );
|
||||||
|
|
||||||
return TRUE;
|
case BFFM_SETSTATUSTEXTA:
|
||||||
|
TRACE("Set status %s\n", debugstr_a((LPSTR)lParam));
|
||||||
|
SetWindowTextA(GetDlgItem(hWnd, IDD_STATUS), (LPSTR)lParam);
|
||||||
|
break;
|
||||||
|
|
||||||
case WM_NOTIFY:
|
case BFFM_SETSTATUSTEXTW:
|
||||||
MsgNotify( hWnd, (UINT)wParam, (LPNMHDR)lParam);
|
TRACE("Set status %s\n", debugstr_w((LPWSTR)lParam));
|
||||||
break;
|
SetWindowTextW(GetDlgItem(hWnd, IDD_STATUS), (LPWSTR)lParam);
|
||||||
|
break;
|
||||||
|
|
||||||
case WM_COMMAND:
|
case BFFM_ENABLEOK:
|
||||||
switch (wParam)
|
TRACE("Enable %ld\n", lParam);
|
||||||
{ case IDOK:
|
EnableWindow(GetDlgItem(hWnd, 1), (lParam)?TRUE:FALSE);
|
||||||
pdump ( pidlRet );
|
break;
|
||||||
if (lpBrowseInfo->pszDisplayName)
|
|
||||||
SHGetPathFromIDListW(pidlRet, lpBrowseInfo->pszDisplayName);
|
|
||||||
EndDialog(hWnd, (DWORD) ILClone(pidlRet));
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
case IDCANCEL:
|
case BFFM_SETOKTEXT: /* unicode only */
|
||||||
EndDialog(hWnd, 0);
|
TRACE("Set OK text %s\n", debugstr_w((LPWSTR)wParam));
|
||||||
return TRUE;
|
SetWindowTextW(GetDlgItem(hWnd, 1), (LPWSTR)wParam);
|
||||||
}
|
break;
|
||||||
break;
|
|
||||||
case BFFM_SETSTATUSTEXTA:
|
case BFFM_SETSELECTIONA:
|
||||||
TRACE("Set status %s\n", debugstr_a((LPSTR)lParam));
|
if (wParam)
|
||||||
SetWindowTextA(GetDlgItem(hWnd, IDD_STATUS), (LPSTR)lParam);
|
FIXME("Set selection %s\n", debugstr_a((LPSTR)lParam));
|
||||||
break;
|
else
|
||||||
case BFFM_SETSTATUSTEXTW:
|
FIXME("Set selection %p\n", (void*)lParam);
|
||||||
TRACE("Set status %s\n", debugstr_w((LPWSTR)lParam));
|
break;
|
||||||
SetWindowTextW(GetDlgItem(hWnd, IDD_STATUS), (LPWSTR)lParam);
|
|
||||||
break;
|
case BFFM_SETSELECTIONW:
|
||||||
case BFFM_ENABLEOK:
|
if (wParam)
|
||||||
TRACE("Enable %ld\n", lParam);
|
FIXME("Set selection %s\n", debugstr_w((LPWSTR)lParam));
|
||||||
EnableWindow(GetDlgItem(hWnd, 1), (lParam)?TRUE:FALSE);
|
else
|
||||||
break;
|
FIXME("Set selection %p\n", (void*)lParam);
|
||||||
case BFFM_SETOKTEXT: /* unicode only */
|
break;
|
||||||
TRACE("Set OK text %s\n", debugstr_w((LPWSTR)wParam));
|
|
||||||
SetWindowTextW(GetDlgItem(hWnd, 1), (LPWSTR)wParam);
|
case BFFM_SETEXPANDED: /* unicode only */
|
||||||
break;
|
if (wParam)
|
||||||
case BFFM_SETSELECTIONA:
|
FIXME("Set expanded %s\n", debugstr_w((LPWSTR)lParam));
|
||||||
if (wParam)
|
else
|
||||||
FIXME("Set selection %s\n", debugstr_a((LPSTR)lParam));
|
FIXME("Set expanded %p\n", (void*)lParam);
|
||||||
else
|
break;
|
||||||
FIXME("Set selection %p\n", (void*)lParam);
|
}
|
||||||
break;
|
return FALSE;
|
||||||
case BFFM_SETSELECTIONW:
|
|
||||||
if (wParam)
|
|
||||||
FIXME("Set selection %s\n", debugstr_w((LPWSTR)lParam));
|
|
||||||
else
|
|
||||||
FIXME("Set selection %p\n", (void*)lParam);
|
|
||||||
break;
|
|
||||||
case BFFM_SETEXPANDED: /* unicode only */
|
|
||||||
if (wParam)
|
|
||||||
FIXME("Set expanded %s\n", debugstr_w((LPWSTR)lParam));
|
|
||||||
else
|
|
||||||
FIXME("Set expanded %p\n", (void*)lParam);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const WCHAR swBrowseTempName[] = {'S','H','B','R','S','F','O','R','F','O','L','D','E','R','_','M','S','G','B','O','X',0};
|
static const WCHAR swBrowseTempName[] = {
|
||||||
|
'S','H','B','R','S','F','O','R','F','O','L','D','E','R','_','M','S','G','B','O','X',0};
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* SHBrowseForFolderA [SHELL32.@]
|
* SHBrowseForFolderA [SHELL32.@]
|
||||||
|
|
Loading…
Reference in New Issue