【发布时间】:2020-08-31 17:08:13
【问题描述】:
直到现在——为了打开一个对话框,我使用了SHBrowseForFolder 函数。它会导致一些错误,我被告知使用IFileOpenDialog。
这是我需要替换的代码:
bool wvFM::SelectFileSystemObjectDialogTree(const WCDialogCreationOptions& in_options,
WCDialogReply& out_Reply)
{
AUTO_FUNC_DEBUG;
DWORD osErr = NO_ERROR;
WTErr wtErr = eNoErr;
out_Reply.accept = false;
if(in_options.m_flags[WCDialogCreationOptions::eSelectFolder]) {
BROWSEINFO bi = {0};
bi.hwndOwner = (HWND)in_options.m_owner;
bi.pidlRoot = NULL; // TBD by callback BrowseCallbackProc
bi.lpszTitle = in_options.m_windowTitle.c_str();
bi.ulFlags = BIF_USENEWUI; // to enable pasting path
bi.lpfn = BrowseCallbackProc; // for initial dir option
WTPathString initialLocationPathString(
in_options.m_InitialDir.GetNativePathString());
bi.lParam = in_options.m_InitialDir.IsValid()
? (LPARAM)initialLocationPathString.c_str()
: NULL;
LPITEMIDLIST pidl = SHBrowseForFolder(&bi);
// returns focus to the internal window of the plug
::SetFocus((HWND)in_options.m_owner);
if(pidl != NULL) {
TCHAR szPath[MAX_PATH];
SHGetPathFromIDList(pidl, szPath);
out_Reply.m_filePathRef = wvFM::WCStPath((char*)szPath);
out_Reply.accept = true;
IMalloc* imalloc = 0;
if(SUCCEEDED(SHGetMalloc(&imalloc))) {
imalloc->Free(pidl);
imalloc->Release();
}
}
return true;
}
我不太确定如何进行这种转换。 感谢任何愿意提供帮助的人!
【问题讨论】:
-
您似乎缺少函数的结尾。左大括号比右大括号多一个。
-
@danieloren 在尝试将此代码从
SHBrowseForFolder()转换为IFileOpenDialog时,您到底遇到了什么问题?到目前为止,您尝试过哪些不适合您的方法? -
@TedLyngmo 因为有问题的代码侧重于设置了
eSelectFolder标志的情况,因此您所指的“缺失”代码包含更多代码来处理以下情况eSelectFolder未设置。 -
@RemyLebeau 可能是。原来的缩进让它看起来好像真的不见了。
-
@danieloren "[SHBrowseForFolder] 导致一些错误" - 究竟是什么错误?
标签: c++ c windows function interface