为什么内置 API 调用没有完成我所需要的操作?
对于这个“为什么?”我能给出的最好答案您的问题的一部分是 WinAPI 使用的“WinInet”库组件(或者至少是based on) Internet Explorer 内部......我们都知道 IE 是多么的狡猾和不合规。
但是,那的文档InternetCanonicalizeUrl功能 https://learn.microsoft.com/en-us/windows/win32/api/wininet/nf-wininet-internetcanonicalizeurla如果您想要更完整/合规的结果,实际上确实建议(尽管是神秘的)替代方案:
在 Internet Explorer 4.0 及更高版本中,InternetCanonicalizeUrl
总是
功能就好像ICU_BROWSER_MODE
标志已设置。客户端应用
必须规范化整个 URL 应该使用CoInternetParseUrl
(随着动作PARSE_CANONICALIZE
和旗帜URL_ESCAPE_UNSAFE
) or UrlCanonicalize
.
我尝试了后一种选择(它似乎是两者中更简单的一种),并为您的问题找到了一个相对简单的解决方案:
// if (InternetCanonicalizeUrl(strFile, strURL.GetBuffer(_MAX_PATH), &dwSize, ICU_BROWSER_MODE))
if (UrlCanonicalize(strFile, strURL.GetBuffer(_MAX_PATH), &dwSize, 0) == S_OK)
{
AfxMessageBox(strURL);
}
strURL.ReleaseBuffer();
在我运行的测试中(使用来自GetTempPath()
),这给出了完整的file:///
前缀并用正斜杠替换所有反斜杠。
(您将需要#include <shlwapi.h>
在代码中的某个位置,链接时还需要包含“Shlwapi.lib”库。)
关于在 a 之后使用三个斜杠file:
“localhost”URL 的前缀,请参阅这个关于超级用户的问答 https://superuser.com/q/352133/1128872.