c++ - 如何使用 PathCreateFromUrlA API

标签 c++ windows visual-studio uri

我需要将 file:///C:/test folder/file.text 之类的 uri 路径转换为 ​​Windows 样式路径 C:/test folder/file.text.为此,我正在尝试使用 PathCreatesFromUrlA API 使用以下代码,但我只是不明白如何设置 API 的最后两个参数(在下面的代码中标记为 ???)。

std::string uri("file:///C:/test folder/file.text");  
char buf[255];  
auto result = ::PathCreateFromUrlA(uri.c_str(), buf, ???, ???); 

PathCreateFromUrlA 声明如下。

LWSTDAPI PathCreateFromUrlA(_In_ PCSTR pszUrl, _Out_writes_to_(*pcchPath, *pcchPath) PSTR pszPath, _Inout_ DWORD *pcchPath, DWORD dwFlags);

据此,第三个参数是指向DWORD的指针,我不明白它的用途是什么以及如何使用它。第四个参数是一些标志的 DWORD。 shlwapi.h 声明了以下标志

#define URL_UNESCAPE                    0x10000000
#define URL_ESCAPE_UNSAFE               0x20000000
#define URL_PLUGGABLE_PROTOCOL          0x40000000
#define URL_WININET_COMPATIBILITY       0x80000000
#define URL_DONT_ESCAPE_EXTRA_INFO      0x02000000
#define URL_DONT_UNESCAPE_EXTRA_INFO    URL_DONT_ESCAPE_EXTRA_INFO
#define URL_BROWSER_MODE                URL_DONT_ESCAPE_EXTRA_INFO
#define URL_ESCAPE_SPACES_ONLY          0x04000000
#define URL_DONT_SIMPLIFY               0x08000000
#define URL_NO_META                     URL_DONT_SIMPLIFY
#define URL_UNESCAPE_INPLACE            0x00100000
#define URL_CONVERT_IF_DOSPATH          0x00200000
#define URL_UNESCAPE_HIGH_ANSI_ONLY     0x00400000
#define URL_INTERNAL_PATH               0x00800000  // Will escape #'s in paths
#define URL_FILE_USE_PATHURL            0x00010000
#if (_WIN32_IE >= _WIN32_IE_IE60SP2)
#define URL_DONT_UNESCAPE               0x00020000  // Do not unescape the path/url at all
#endif // _WIN32_IE_IE60SP2
#if (NTDDI_VERSION >= NTDDI_WIN7)
#define URL_ESCAPE_AS_UTF8              0x00040000  // Percent-encode all non-ASCII characters as their UTF-8 equivalents.
#endif // (NTDDI_VERSION >= NTDDI_WIN7)
#if (NTDDI_VERSION >= NTDDI_WIN8)
#define URL_UNESCAPE_AS_UTF8            URL_ESCAPE_AS_UTF8
#define URL_ESCAPE_ASCII_URI_COMPONENT  0x00080000  // Percent-encode all ASCII characters outside of the unreserved set from URI RFC 3986 (a-zA-Z0-9-.~_) (i.e.) No need for URL_ESCAPE_PERCENT along with this.
#define URL_ESCAPE_URI_COMPONENT        (URL_ESCAPE_ASCII_URI_COMPONENT | URL_ESCAPE_AS_UTF8)
#define URL_UNESCAPE_URI_COMPONENT      URL_UNESCAPE_AS_UTF8
#endif // (NTDDI_VERSION >= NTDDI_WIN8)
#define URL_ESCAPE_PERCENT              0x00001000
#define URL_ESCAPE_SEGMENT_ONLY         0x00002000  // Treat the entire URL param as one URL segment.

#define URL_PARTFLAG_KEEPSCHEME         0x00000001

#define URL_APPLY_DEFAULT               0x00000001
#define URL_APPLY_GUESSSCHEME           0x00000002
#define URL_APPLY_GUESSFILE             0x00000004
#define URL_APPLY_FORCEAPPLY            0x00000008

我不知道哪个标志适合我的用例。有什么建议吗?

最佳答案

第三个参数表示缓冲区的大小(很可能包含函数返回后写入或需要的字符数)。 MSDN说第四个参数是保留的,必须是0。

std::string uri("file:///C:/test folder/file.text");  
char buf[MAX_PATH];  
DWORD cch = ARRAYSIZE(buf);
HRESULT hr = ::PathCreateFromUrlA(uri.c_str(), buf, &cch, 0);
if (SUCCEEDED(hr)) ...

关于c++ - 如何使用 PathCreateFromUrlA API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55876283/

相关文章:

c++ - VS Code 不会构建具有多个 .ccp 源文件的 C++ 程序

c++ - 嵌套模板的可能性

c# - 使用 HockeyApp(Windows) 发送已处理的异常报告

visual-studio - Visual Studio 2008 的 Prefast

c++ - 我应该学习使用 C++ STL 容器而不是构建它们吗?

c++ - MSVC2010 的嵌套模板解决方法?

windows - 如何本地化 Windows 商店应用程序中的通知和组合框? (C#/XAML,多语言应用工具包)

java - 在 Windows 7 上使用 Hadoop 2.2 运行 JUnit 测试

c# - 无法在 Visual Studio (Mac) 上使用 .NET Core 3.1 创建 Web 应用

c++ - STL vector 无故损坏,VC++ 2017