使用MFC将文件路径转换为URL

2024-02-07

我见过类似的问题(例如用 C++ 对 URL 进行编码/解码 https://stackoverflow.com/q/154536/2287576)。但是,对我来说:

CString strURL;
DWORD dwSize = _MAX_PATH;
if (InternetCanonicalizeUrl(strFile, strURL.GetBuffer(_MAX_PATH), &dwSize, ICU_BROWSER_MODE))
{
    // still has backslash
    AfxMessageBox(strURL);
}
strURL.ReleaseBuffer();

strURL = strFile;
strURL.Replace(L"\\", L"/");
strURL = L"file:///" + strURL;
AfxMessageBox(strURL);

Using InternetCanonicalizeUrl不工作:

  1. 前缀是file://并不是file:///.
  2. The \没有被替换为/.

我是手动完成的,我的 URL 版本适用于我的后续版本WebView2 https://learn.microsoft.com/en-us/microsoft-edge/webview2/concepts/working-with-local-content?tabs=win32cpp#navigate-to-a-file-url功能。为了澄清,路径本身是用::GetTempPath() and/or ::GetTempFileName().

为什么内置 API 调用没有完成我所需要的操作?


为什么内置 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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用MFC将文件路径转换为URL 的相关文章

随机推荐