604
社区成员
发帖
与我相关
我的任务
分享
#include <shlobj.h>
#ifndef WM_GETISHELLBROWSER
#define WM_GETISHELLBROWSER (WM_USER+7)
#endif
#define GetPIDLFolder(pida) (LPCITEMIDLIST)(((LPBYTE)pida)+(pida)->aoffset[0])
#define GetPIDLItem(pida, i) (LPCITEMIDLIST)(((LPBYTE)pida)+(pida)->aoffset[i+1])
BOOL ILIsFile(LPCITEMIDLIST pidl)
{
BOOL bRet = FALSE;
LPCITEMIDLIST pidlChild = NULL;
IShellFolder* psf = NULL;
HRESULT hr = SHBindToParent(pidl, IID_IShellFolder, (LPVOID*) & psf, &pidlChild);
if (SUCCEEDED(hr) && psf)
{
SFGAOF rgfInOut = SFGAO_FOLDER | SFGAO_FILESYSTEM;
hr = psf->GetAttributesOf(1, &pidlChild, &rgfInOut);
if (SUCCEEDED(hr))
{
if ((~rgfInOut & SFGAO_FOLDER) && (rgfInOut & SFGAO_FILESYSTEM))
{
bRet = TRUE;
}
}
psf->Release();
}
return bRet;
}
void __fastcall TOpenDialog::GetFileNames(tagOFNW &OpenFileName)
{
static TStringList *lst = new TStringList;
FORMATETC fmte;
STGMEDIUM stgmedium;
LPITEMIDLIST pidlFull = NULL;
IShellView * pIShellView = NULL;
LPMALLOC pMalloc = NULL;
IDataObject* pIDataObject = NULL;
IShellBrowser* pSB = (IShellBrowser*)SendMessage(GetParent(Handle), WM_GETISHELLBROWSER, 0, 0);
TCHAR szPath[_MAX_PATH];
if (pSB == NULL) //GetFileNames被调用两次,第二次pSB为空, 返回第一次结果
{
if (lst)
{
FFileName = lst->Count > 0 ? lst->Strings[0] : String("");
FFiles->Assign(lst);
delete lst;
lst = NULL;
}
return;
}
if (lst == NULL)
lst = new TStringList;
ZeroMemory((LPVOID) & fmte, sizeof(STGMEDIUM));
ZeroMemory((LPVOID) & fmte, sizeof(FORMATETC));
fmte.tymed = TYMED_HGLOBAL;
fmte.lindex = -1;
fmte.dwAspect = DVASPECT_CONTENT;
fmte.cfFormat = RegisterClipboardFormat(CFSTR_SHELLIDLIST);
do
{
HRESULT hr = pSB->QueryActiveShellView(&pIShellView);
if (FAILED(hr))
break;
hr = ::SHGetMalloc(&pMalloc);
if (FAILED(hr))
break;
hr = pIShellView->GetItemObject(SVGIO_SELECTION, IID_IDataObject, (LPVOID*) & pIDataObject);
if (FAILED(hr))
break;
if (pIDataObject == NULL)
break;
hr = pIDataObject->GetData(&fmte, &stgmedium);
if (FAILED(hr))
break;
LPIDA pida = (LPIDA)GlobalLock(stgmedium.hGlobal);
if (pida)
{
LPCITEMIDLIST pidlFolder = GetPIDLFolder(pida);
for (UINT i = 0; i < pida->cidl; i++)
{
LPCITEMIDLIST pidl = GetPIDLItem(pida, i);
pidlFull = ILCombine(pidlFolder, pidl);
if (ILIsFile(pidlFull))
{
ZeroMemory(szPath, sizeof(TCHAR) * _MAX_PATH);
hr = SHGetPathFromIDList(pidlFull, szPath);
if (SUCCEEDED(hr))
{
lst->Add((szPath));
}
}
pMalloc->Free(pidlFull);
pidlFull = NULL;
}
}
GlobalUnlock(stgmedium.hGlobal);
ReleaseStgMedium(&stgmedium);
}
while (FALSE);
if (pIDataObject) pIDataObject->Release();
if (pIShellView) pIShellView->Release();
if (pMalloc)
{
if (pidlFull) pMalloc->Free(pidlFull);
pMalloc->Release();
}
}
BOOL GetOpenFileName(LPOPENFILENAME lpofn);
typedef struct tagOFN { // ofn
DWORD lStructSize;
HWND hwndOwner;
HINSTANCE hInstance;
LPCTSTR lpstrFilter;
LPTSTR lpstrCustomFilter;
DWORD nMaxCustFilter;
DWORD nFilterIndex;
LPTSTR lpstrFile;
DWORD nMaxFile;
LPTSTR lpstrFileTitle;
DWORD nMaxFileTitle;
LPCTSTR lpstrInitialDir;
LPCTSTR lpstrTitle;
DWORD Flags;
WORD nFileOffset;
WORD nFileExtension;
LPCTSTR lpstrDefExt;
DWORD lCustData;
LPOFNHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
} OPENFILENAME;