如何解决更改SHBrowseForFolder的使用并将结构BROWSEINFO更改为-IFileOpenDialog
直到现在-为了打开一个对话框,我使用了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;
}
我不太确定如何进行转换。 感谢任何将提供帮助的人!
解决方法
您显然正在使用带有某种自定义字符串类型的第三方库,但是您未提供有关该字符串类型实际是什么的任何详细信息。我正在猜测该字符串类型基于char
,因为当您将SHGetPathFromIDList()
的结果类型转换为char*
时,会将其类型转换为{{ 1}},因此您可能会使用未定义的out_Reply.m_filePathRef
来编译项目,以便UNICODE
映射到TCHAR
而不是char
。在这种情况下,wchar_t
将呼叫SHBrowseForFolder()
而不是SHBrowseForFolderA()
。
SHBrowseForFolderW()
根本不处理ANSI字符串,仅处理UNICODE字符串,因此您将必须根据需要在第三方字符串类型和Windows UTF-16字符串之间来回转换。
从IFileOpenDialog
到SHBrowseForFolder()
的转换看起来大致 如下所示(其中IFileOpenDialog
中的YourStringType
是第三方字符串类型-根据指示进行所需的任何调整):
toWString()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。