求助:我想通过 ShellExecute 打开一个目录,并选定一个文件

低调的小青蛙 2008-06-25 05:28:12
目前我只能通过 ShellExecute 打开一个目录,但没有办法选定该目录下的一个我指定的文件。

Internet Explorer 浏览器里面有我想要的效果: 当从网页上下载完一个文件后,浏览器会弹出提示“打开”“打开目录”。如果选择打开目录,则浏览器会打开保存的目录并选定刚才下载的文件。

请问大侠们,要点在哪里?
...全文
123 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
菜牛 2008-06-25
  • 打赏
  • 举报
回复
SHOpenFolderAndSelectItems Function
CathySun118 2008-06-25
  • 打赏
  • 举报
回复
http://support.microsoft.com/kb/130510
闪破风浪 2008-06-25
  • 打赏
  • 举报
回复
收藏~
hosin 2008-06-25
  • 打赏
  • 举报
回复
很好,Mark一下。
cofanz 2008-06-25
  • 打赏
  • 举报
回复

HRESULT GetShellFolderViewDual(ITEMIDLIST* pidl, IShellFolderViewDual** ppIShellFolderViewDual)
{
IWebBrowserApp* pIWebBrowserApp;
IDispatch* pDoc;
HWND hWnd;
HRESULT hr;
HINSTANCE ghSHDOCVW;

HRESULT (WINAPI*gpfSHGetIDispatchForFolder)(ITEMIDLIST* pidl, IWebBrowserApp** ppIWebBrowserApp);

*ppIShellFolderViewDual = NULL;

ghSHDOCVW = LoadLibrary(_T("SHDOCVW.DLL"));
if (ghSHDOCVW == NULL)
return FALSE;

pIWebBrowserApp=NULL;
gpfSHGetIDispatchForFolder =
(HRESULT (WINAPI*)(ITEMIDLIST*, IWebBrowserApp**)) GetProcAddress(ghSHDOCVW, "SHGetIDispatchForFolder");
if (gpfSHGetIDispatchForFolder == NULL)
return FALSE;


if (SUCCEEDED(gpfSHGetIDispatchForFolder(pidl, &pIWebBrowserApp)))
{
if (SUCCEEDED(pIWebBrowserApp->get_HWND((long*)&hWnd)))
{
SetForegroundWindow(hWnd);
ShowWindow(hWnd, SW_SHOWNORMAL);
}

if (SUCCEEDED(hr = pIWebBrowserApp->get_Document(&pDoc)))
{
pDoc->QueryInterface(IID_IShellFolderViewDual, (void**) ppIShellFolderViewDual);
pDoc->Release();
}

pIWebBrowserApp->Release();
}
FreeLibrary(ghSHDOCVW);

return TRUE;
}

BOOL OpenFolderAndSelectItems(ITEMIDLIST *pidlFolder)
{
ITEMIDLIST *pidl, *pidl2;
ITEMIDLIST* pIdlFile;
USHORT cb;
IShellFolderViewDual* pIShellFolderViewDual;

HRESULT (WINAPI *gpfSHOpenFolderAndSelectItems)(LPCITEMIDLIST *pidlFolder, UINT cidl, LPCITEMIDLIST *apidl, DWORD dwFlags);
HINSTANCE ghShell32;

/// 只有WinXp及以上及系统才支持SHOpenFolderAndSelectItems() API
/// 那其它系统该怎么实现这个功能呢?只能采用其它的方法来处理
/// 首先用XP跟踪到SHOpenFolderAndSelectItems()API中,看它是如何处理的,再用同样的方法去实现
/// 其它系统的这个功能使用工具 VC6 .net 2003 MSDN Ollydbg v1.10中文版

ghShell32 = LoadLibrary(_T("Shell32.DLL"));
if (ghShell32 == NULL)
return FALSE;

gpfSHOpenFolderAndSelectItems =
(HRESULT (WINAPI*)(LPCITEMIDLIST*, UINT, LPCITEMIDLIST*, DWORD)) GetProcAddress(ghShell32, "SHOpenFolderAndSelectItems");
if (gpfSHOpenFolderAndSelectItems != NULL)
{
/// 可以获得SHOpenFolderAndSelectItems()函数的API地址
if (SUCCEEDED(gpfSHOpenFolderAndSelectItems((LPCITEMIDLIST*)pidlFolder,0,(LPCITEMIDLIST*)NULL,0)))
{
///直接调用系统的功能
FreeLibrary(ghShell32);
return TRUE;
}
FreeLibrary(ghShell32);
return FALSE;
}
FreeLibrary(ghShell32);

/// 当操作系统不支持SHOpenFolderAndSelectItems()函数的API时的处理,
/// 自已动手写一个与系统功能相同的代码
pidl = pidlFolder;
pIdlFile = pidl;
/// 找出目标文件中文件名的偏移量
while (cb = pIdlFile->mkid.cb)
{
pidl2 = pIdlFile;
pIdlFile = (ITEMIDLIST*)((BYTE*)pIdlFile + cb);
}

cb = pidl2->mkid.cb;
pidl2->mkid.cb = 0;

/// 打开目标文件所在的文件夹
if (SUCCEEDED(GetShellFolderViewDual(pidl, &pIShellFolderViewDual)))
{
pidl2->mkid.cb = cb;
// 0 Deselect the item.
// 1 Select the item.
// 3 Put the item in edit mode.
// 4 Deselect all but the specified item.
// 8 Ensure the item is displayed in the view.
// 0x10 Give the item the focus.
COleVariant bszFile(pidl2);
if(pIShellFolderViewDual != NULL)
{
/// 选中相应的选项
pIShellFolderViewDual->SelectItem(bszFile, 0x1d);
pIShellFolderViewDual->Release();
}
return TRUE;
}
return FALSE;
}

void FindTarget(CString str)
{
HRESULT hres;
IShellLink *psl;
ITEMIDLIST *pidl;
IPersistFile *ppf;

// Get a pointer to the IShellLink interface.
hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
IID_IShellLink, (LPVOID*)&psl);
if (SUCCEEDED(hres))
{
// 设置目标文件
psl->SetPath(str);
/// 获得目标文件的ITEMIDLIST
psl->GetIDList(&pidl);

// Get a pointer to the IPersistFile interface.
hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf);
if (SUCCEEDED(hres))
{
WCHAR wsz[MAX_PATH];
#ifdef _UNICODE
wcscpy(wsz, str);
#else
// Ensure that the string is Unicode.
MultiByteToWideChar(CP_ACP, 0, str, -1, wsz, MAX_PATH);
#endif

// Load the shortcut.
hres = ppf->Load(wsz, STGM_READ);
if (SUCCEEDED(hres))
{
/// 获得快捷方式的ITEMIDLIST
psl->GetIDList(&pidl);
}
ppf->Release();
}

/// 打开文件夹并选中项目
OpenFolderAndSelectItems(pidl);
psl->Release();
}
}
cnzdgs 2008-06-25
  • 打赏
  • 举报
回复
ShellExecute(NULL, _T("open"), _T("Explorer"), _T("/select, C:\\1.txt"), NULL, SW_SHOW);
Amuro1987218 2008-06-25
  • 打赏
  • 举报
回复
WinExec("explorer /n,/select, c:\\1.txt", SW_SHOWNORMAL );

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧