【发布时间】:2021-11-29 15:03:57
【问题描述】:
我正在通过IPersistMonikerLoad方法加载本地磁盘驱动器_test.htm文件。据我所知,它应该将相对 URL 的路径添加为基本路径。问题是 - 它没有这样做。相反,它需要很长时间来尝试解析来自 Internet 的路径,直到它放弃(大约 20-30 秒)。我想要的是在检测到无法解析的路径后立即放弃(因为它无论如何都是本地磁盘文件)。
这是我正在加载的 HTML 示例:
<html>
<head>
<script src="//test/test.js"></script>
<head>
<body>
<img src="image.jpg">
<img src="/image.jpg">
<img src="//image.jpg">
</body>
</html>
没有错误检查的简化代码(C++ Builder):
WideString URL = "file:///" + StringReplace(ExtractFilePath(Application->ExeName), "\\", "/", TReplaceFlags() << rfReplaceAll) + "_test.htm";
TCppWebBrowser* WB = CppWebBrowser1;
DelphiInterface<IMoniker> pMoniker;
OleCheck(CreateURLMonikerEx(NULL, URL.c_bstr(), &pMoniker, URL_MK_UNIFORM));
DelphiInterface<IHTMLDocument2> diDoc2 = WB->Document;
DelphiInterface<IPersistMoniker> pPrstMnkr;
OleCheck(diDoc2->QueryInterface(IID_IPersistMoniker, (LPVOID*)&pPrstMnkr));
DelphiInterface<IBindCtx> pBCtx;
OleCheck(CreateBindCtx(0, &pBCtx));
pPrstMnkr->Load(0, pMoniker, pBCtx, STGM_READWRITE);
问题 - image.jpg 加载正常,但路径 //test/test.js 和 /image.jpg 和 //image.jpg 需要很长时间才能解决/加载。据我了解,CreateURLMonikerEx 应该使用file:///path/to/executable/ 并自动将其添加到这些路径中,在这种情况下它们会立即失败——例如file:///path/to/executable//test/test.js。这不会发生。
我还尝试将 image.jpg 移动到子文件夹,然后使用从自定义路径加载图像的 GetDisplayName 和 BindToStorage 实现创建自定义 IMoniker 接口。但是,对于以// 或/ 开头的路径,它不会做同样的事情。即使我通过*ppszDisplayName参数在GetDisplayName中输出file:///path/to/executable/。
如何避免长时间加载此类不可用的链接(丢弃它们),或将它们重定向到上述本地路径?
我找到了在*ppszDisplayName 中使用about:blank 的部分解决方案,但它不会加载具有有效路径image.jpg 的图像,因为它会将它们加载为about:image.jpg,这又是无效路径。
另外 - 我尝试添加 IDocHostUIHandler 接口和 Invoke 方法的实现 (DISPID_AMBIENT_DLCONTROL) 与 pVarResult->lVal = DLCTL_NO_SCRIPTS | DLCTL_NO_JAVA | DLCTL_NO_RUNACTIVEXCTLS | DLCTL_NO_DLACTIVEXCTLS | DLCTL_NO_FRAMEDOWNLOAD | DLCTL_FORCEOFFLINE; - 它完全阻止图像的下载,但仍然检查 20-30 秒对于以// 或/ 开头的链接。
【问题讨论】:
标签: c++ webbrowser-control c++builder twebbrowser mshtml