我有一个用于应用程序的异步可插入协议处理程序,该处理程序主要模仿 file:// 协议,但将请求限制在应用程序中配置的沙箱中。
该应用程序使用 C# 中的 WebBrowser 控件托管 AngularJS Web 应用程序。当 Angular 的路由器使用该协议请求视图模板文件时,我会收到一个对 IInternetProtocolInfo::CombineUrl() 实现的请求,其中包含以下 baseUrl 和 relativeUrl:
pwzBaseUrl: myProtocol:///webApp/app/index.html#/start
pwzRelativeUrl: views/start.html
我的代码是:
wchar_t buf[2048] = { 0 };
DWORD ret = 2048;
UrlCombine(pwzBaseUrl, pwzRelativeUrl, buf, &ret, 0);
// pwzResult is myProtocol:///webApp/app/views/start.html here
StringCchCopy(pwzResult, ret + 1, buf);
*pcchResult = ret + 1;
return S_OK;
这会导致使用以下 url 调用 IInternetProtocol::Start():
szUrl: myProtocol:///webApp/app/views/start.html/webApp/app/views/start.html
正如我们所看到的,文件的路径已被复制,我不知道为什么。似乎只有 AngularJS 的视图模板文件会遇到这个问题;其他相对路径绝对可以正常工作(例如从 bower_components/node_modules 中提取其他脚本文件)。
如果它是重复的,我想避免不得不破解它以将路径分成两半。urlmon 用这个奇怪的 url 调用我的协议一定是有原因的......