Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows IFileDialog:添加自定义地点-并选择该地点_Windows_Ifiledialog - Fatal编程技术网

Windows IFileDialog:添加自定义地点-并选择该地点

Windows IFileDialog:添加自定义地点-并选择该地点,windows,ifiledialog,Windows,Ifiledialog,我正在使用IFileDialog::AddPlace将例如“c:\\my\\custom\\location”添加为自定义位置,以便从左侧的导航面板中选择文件,并将其设置为(默认/强制)初始文件夹 但是,当对话框打开时,将选择根驱动器(示例中的C:而不是自定义位置) (我使用SHCreateItemFromParsingName从路径创建IShellItem,并在AddPlace和SetFolder中使用相同的Shellitem) 结果: 完整来源:我不确定您是否可以直接从IFileDialog

我正在使用
IFileDialog::AddPlace
将例如
“c:\\my\\custom\\location”
添加为自定义位置,以便从左侧的导航面板中选择文件,并将其设置为(默认/强制)初始文件夹

但是,当对话框打开时,将选择根驱动器(示例中的C:而不是自定义位置)

(我使用
SHCreateItemFromParsingName
从路径创建
IShellItem
,并在
AddPlace
SetFolder
中使用相同的Shellitem)

结果:


完整来源:

我不确定您是否可以直接从IFileDialog界面选择虚拟文件夹。但您可以订阅并从内部访问

树视图实现了该接口

intmain()
{
共初始化(空);
{
LPCWSTR customPath=L“c:\\temp”;//使用存在的路径。。。
CComPtr dlg;
检查(CoCreateInstance(CLSID_FileOpenDialog、nullptr、CLSCTX_ALL、IID_PPV_参数(&dlg));
//订阅活动
MyFileDialogEvents*fde=新建MyFileDialogEvents();
德沃德·库奇;
检查(dlg->通知(fde和cookie));
买方所在地;
选中(SHCreateItemFromParsingName(customPath、nullptr、IID_PPV_参数(&location));
检查(dlg->AddPlace(位置,FDAP_顶部));
检查(dlg->SetFolder(位置));
检查(dlg->显示(0));
检查(dlg->Unadvise(cookie));
删除fde;
}
coninitialize();
返回0;
}
类MyFileDialogEvents:public IFileDialogEvents
{
//选择更改时调用
HRESULT STDMETHODCALLTYPE on选择更改(IFileDialog*pfd)
{
//获取comdlg服务提供商
CComPtr sp;
检查(pfd->查询接口(&sp));
//获取资源管理器浏览器
//注意:如果直接从IFileDialog*而不是从事件调用,则此调用将失败
CComPtr unk;
检查(sp->QueryService(SID_STopLevelBrowser,&unk));
//获取其服务提供商
CComPtr sp2;
检查(unk->QueryInterface(&sp2));
//获取树控件
CComPtr-ctl;
检查(sp2->查询服务(IID_INameSpaceTreeControl和ctl));
//获取所有根,“应用程序链接”是根
菜根;
选中(ctl->GetRootItems(&roots));
德沃德计数;
检查(根->获取计数(&count));
//搜索“应用程序链接”文件夹
对于(DWORD i=0;iGetItemAt(i,&root));
//获取规范化名称,而不是显示(本地化)名称
CCOMHEAPTR名称;
选中(root->GetDisplayName(SIGDN_DESKTOPABSOLUTEPARSING,&name));
//CLSID_应用程序建议的位置?
如果(!lstrcmpi(名称,L):{C57A6066-66A3-4D91-9EB9-41532179F0A5}”))
{
//找到,展开它
ctl->SetItemState(根目录,NSTCIS_展开,NSTCIS_展开);
//生第一个孩子
//TODO:在所有建议的位置(地点)上循环,并使用我们正在寻找的位置,而不是盲目地选择第一个。。。
幼儿;
ctl->GetNextItem(根目录、NSTCGNI_子目录和子目录);
if(child.p)//这可能不会在我们第一次被调用时成功
{
//选择项目
ccomheaptr childName;
ctl->SetItemState(子项,选择NSTCIS,选择NSTCIS);
}
其他的
{
//选择一些东西,这样我们就可以回到这里
HRCHECK(pfd->设置文件夹(位置));
}
打破
}
}
返回S_OK;
}
//可怜人的COM实现用于演示目的。。。
HRESULT STDMETHODCALLTYPE查询接口(refid riid,void**ppvObject)
{
*ppvObject=NULL;
如果(riid==IID\U IFileDialogEvents)
{
*ppvObject=(IFileDialogEvents*)此;
返回S_OK;
}
如果(riid==IID_IUnknown)
{
*ppvObject=(IUnknown*)此;
返回S_OK;
}
返回E_NOINTERFACE;
}
ULONG STDMETHODCALLTYPE AddRef(){return 1;}
ULONG STDMETHODCALLTYPE Release(){return 1;}
HRESULT STDMETHODCALLTYPE OnFileOk(IFileDialog*pfd){返回S_OK;}
HRESULT STDMETHODCALLTYPE onFolderChangeing(IFileDialog*pfd,IShellItem*psiFolder){返回S_OK;}
HRESULT STDMETHODCALLTYPE OnFolderChange(IFileDialog*pfd){返回S_OK;}
HRESULT STDMETHODCALLTYPE onShareVersion(IFileDialog*pfd、IShellItem*psi、FDE\u SHAREVIOLATION\u RESPONSE*pResponse){返回S\u OK;}
HRESULT STDMETHODCALLTYPE OnTypeChange(IFileDialog*pfd){返回S_OK;}
HRESULT STDMETHODCALLTYPE OnOverwrite(如果对话框*pfd,IShellItem*psi,FDE_OVERWRITE_RESPONSE*响应前){返回S_OK;}
};

注意:为了简单起见,我使用Visual Studio的ATL smart pointers类。

您的代码似乎适合我(我的意思是几乎您的代码,您的最终结果不适合我,所以我不使用它)。请注意,自定义位置是从根驱动器(如C:)中选择的,而不是从“应用程序链接”虚拟文件夹中选择的,但它已被选中。是的,我看到了与您描述的相同的行为,但问题是是否有办法选择虚拟文件夹。嘿,谢谢!这几乎是可行的,除了(正如您在注释中所注意到的)Required接口太晚才可用,所以它仍然从错误的地方开始。我会再修补一点,也许我可以让它不太脆的工作。准备好接受你的答案了,只想让它再打开两天,尽管我怀疑会出现更好的答案…奇怪的是,对我来说,当对话框打开时,在虚拟“应用程序链接”中选择了自定义路径。您可以在OnFolderChange/OnFolderChange中获取顶级浏览器引用(它们在前面被提出),并将其作为成员保留,以便在调用其他事件时使用。我尝试了所有事件(“直到一个事件通过”),但只有在某些用户操作后才会发生这种情况。也许创建一个临时不可见的HWND,在那里设置一个0毫秒的定时器,然后在WM_定时器响应中重试确实可以解决这个问题,但这感觉很不舒服