本文翻译自http://msdn.microsoft.com/workshop/browser/hosting/wbcustomization.asp 

本文的更新版本位于http://blog.csdn.net/jiangsheng/archive/2004/11/07/170742.aspx

自定义浏览器

本教程提供了自定义浏览器控件的行为和外观的一些方法。你将看到高级的宿主接口,IDocHostUIHandler, IDocHostUIHandler2, IDocHostShowUI, 和ICustomDoc。本文也讨论其他自定义方法,例如在宿主的IDispatch实现中处理DISPID_AMBIENT_DLCONTROL来进行下载控制;以及使用IHostDialogHelper。

本文分为如下章节

  • 前提和需求
  • 介绍
  • 浏览器自定义架构
  • IDocHostUIHandler
  • IDocHostUIHandler2
  • GetOptionKeyPath 和 GetOverrideKeyPath比较
  • 控制导航
  • IDocHostShowUI
  • 控制下载和执行
  • IHostDialogHelper
  • 控制新的窗口
  • 结论

前提和需求

为了理解和使用本教程,你需要

  • 对C++和COM的深入了解
  • 熟悉活动模板库 (ATL)
  • 安装了Microsoft(R) Internet Explorer (IE)6 或更高版本
  • 开发环境具有用于IE6或更高版本的头文件和库文件;特别是Mshtmhst.h.译者注:可以在http://www.microsoft.com/msdownload/platformsdk/sdkupdate/ 这里下载最新的Internet Development SDK

许多自定义特性是在IE5或者5.5版本就可以使用的,但是有几个特性需要IE6。使用某个特性之前,应该检查参考文档以获得版本信息。

介绍

集成浏览器控件是快速软件开发的强有力的工具。通过成为浏览器的宿主,你可以利用便于使用的Dynamic HTML (DHTML), HTML, 和Extensible Markup Language (XML)来显示信息和开发一个用户界面。但是,浏览器控件的行为可能不确切符合你的需求。例如,默认的状态允许用户通过快捷菜单的查看源代码选项查看一个显示的页面的源代码,你可能需要禁用或者干脆去掉这个选项。你可能更进一步,需要用你自己的快捷菜单替换默认的快捷菜单。

在刚刚提到的自定义特性之外,高级宿主特性允许

  • 在显示的页面上的按钮和其他控件可以调用你的应用程序的内建方法,有效地扩展DHTML对象模型(DOM)
  • 改变拖放的行为
  • 限制浏览器的导航,例如,限制于指定的页面/域,或者站点
  • 捕获用户键入,并且在需要的时候处理。比如说,你可能需要捕获CTRL+O来阻止用户在新的IE中打开网页而不是使用你的程序打开,
  • 改变默认字体和显示设置
  • 控制下载内容,以及当下载完成之后浏览器的处理。例如,你可能禁用视频的播放,脚本的执行,点击链接时打开新的窗口,或者Microsoft(R) ActiveX 控件的下载和执行。
  • 限制查看源代码
  • 捕获搜索
  • 捕获导航错误
  • 替代/修改快捷菜单或者禁用,替代,自定义,或者添加快捷菜单项
  • 为你的应用程序改变注册表设定
  • 控制和修改浏览器控件显示的消息框
  • 控制新窗口的创建方式

在下列中,我们将会看到多数,但是不是全部的这些可能性而且讨论该如何实现他们。

浏览器自定义架构

介绍 IDocHostUIHandler , IDocHostUIHander2 , IDocHostShowUI 和 ICustomDoc

下面三个接口是浏览器控件用户界面的自定义核心:IDocHostUIHandler ,IDocHostUIHandler2 和 IDocHostShowUI。当你修改浏览器控件的时候 , 这些是你在你的应用程序中实现的接口。也有一些服务接口。 ICustomDoc 被MSHTML实现并且提供一个方法在某些情况下能够自定义浏览器控件。IHostDialogHelper提供一个方法打开可信对话框,没有像IE对话框那样为他们(译者注:在标题栏上)作标记。

除了使用这些接口,你还可以做其他件事。一,你能通过在IDispatch实现中拦截环境特性的变化来控制下载其次,你能通过在IDispatch实现中拦截DISPID_NEWWINDOW2控制窗口的创建方式

译者注:MFC7中的DHTML类,例如CHtmlView和CDHtmlDialog实现了这些接口,但是对于使用其他的类库的程序员,可能需要自己实现这些接口。

如何工作

当一个容器提供对ActiveX 控件支持时候 , 浏览器控件自定义机制被设计为被自动化。当浏览器控件被实例化的时候,如果可能的话,它尝试找来自宿主的 IDocHostUIHandler , IDocHostUIHandler2 和 IDocHostShowUI 实现浏览器控件通过调用宿主的IOleClientSite接口的一个QueryInterface方法来查找。

译者注:IE5.5有个Bug,没有查询IDocHostUIHandler2 接口的实现,这使得宿主程序不能覆盖默认的参数。需要更多信息的话,参考微软知识库文章 Q272968 BUG:IDocHostUIHandler2 没有在浏览器控件中调用。
 

这一个结构为一个实现一个IOleClientSite接口的应用程序自动地工作,通过调用浏览器的IOleObject::SetClientSite方法传递给浏览器控件一个IOleClientSite接口。浏览器控件的一个典型的实例化可能看起来像这样:

例子


//为了明确起见,省略错误检查

CComPtr<IOleObject> spOleObj;

//创建 WebBrowser--类成员变量 m_spWebBrowser中保存指针

CoCreateInstance(CLSID_WebBrowser, NULL, CLSCTX_INPROC, IID_IWebBrowser2, (void**)&m_spWebBrowser);

// 查询WebBrowserIOleObject接口

m_spWebBrowser->QueryInterface(IID_IOleObject, (void**)&spOleObj);

//设置用户站点

spOleObj->SetClientSite(this);

//本地激活浏览器控件

RECT rcClient

GetClientRect(&rcClient);

spOleObj->DoVerb(OLEIVERB_INPLACEACTIVATE, NULL, this, 0, GetTopLevelWindow(), &rcClient);

//容器拦截浏览器事件的注册

AtlAdvise(m_spWebBrowser,GetUnknown(), DIID_DWebBrowserEvents2,&m_dwCookie);

//导航到启动页

m_spWebBrowser->Navigate(L"res://webhost.exe/startpage.htm", NULL, NULL, NULL, NULL);


 

然而,如果你的应用程序没有一个IOleClientSite接口,你并没失去全部希望。IE提供ICustomDoc接口,这样你能自己传递你的IDocHostUIHandler接口给浏览器。你不能使用IDocHostUIHandler2和 IDocHostShowUI接口而不提供一个浏览器控件宿主的IOleClientSite接口。

译者注:

MFC7中引入的类COleControlContainer和一大堆DHTML类曾经搞得我晕头转向,最后我不得不放弃了自己对IOleClientSite的实现,而通过ICustomDoc来显式地设置IDocHostUIHandler接口。这样必须在第一个页面下载完成之后才能够开始自定义浏览器,因为暴露ICustomDoc接口的对象只有在第一个页面下载完成之后才可用。一个ICustomDoc的示例可以在CSDN文档中心找到,网址是http://www.csdn.net/develop/Read_Article.asp?Id=8813

 

当浏览器控件获得了对这些接口之中的任何一个的一个指针的时候,接口的方法在适当的时候在浏览器控件的生命期中被调用。举例来说, 当用户右击在浏览器控件的客户区的任何地点时,在IE显示它的默认快捷菜单之前,你的IDocHostUIHandler::ShowContextMenu的实现将会被调用。这给你一个机会显示你自己的快捷菜单而且取消IE的快捷菜单显示。

译者注:一些屏蔽快捷菜单的示例可以在CSDN文档中心找到,网址是http://www.csdn.net/develop/article/18/18541.shtm

当初始化浏览器控件的时候 ,记住几个重点。你的应用程序应该使用 OleInitialize而不是CoInitialize启动COM。OleInitialize启用剪贴簿支持,拖放,对象连接与嵌入(OLE)和本地激活。当你的应用程序结束的时候使用OleUninitialize关闭COM库。

ATL COM 向导使用 CoInitialize而不是OleInitialize打开COM库。 如果你使用这一个向导建立一个可运行的程序,你需要将 CoInitialize 和 CoUninitialize 调用换成 OleInitialize 和 OleUninitialize。对于一个微软基础类 (MFC) 应用程序, 确定你的应用程序调用 AfxOleInit, 它在它的初始化程序中调用OleInitialize。

如果你不需要在你的应用程序中支持拖放,你可以调用IWebBrowser2::RegisterAsDropTarget,传递VARIANT_TRUE(译者注:原文如此,按照接口文档,似乎应该传递VARIANT_FALSE), 避免任何在你的浏览器控件实例上的拖放操作。

一个浏览器控件宿主应用程序也需要IOleInPlaceSite的一个实现, 由于 IOleInPlaceSite派生自IOleWindow,应用程序将需要IOleWindow的一个实现。你需要这些实现使得你的应用程序具有一个窗口,显示浏览器控件,以及处理它的显示设置。

这些接口和IOleClientSite的实现在许多情况可能是最小的或不存在的。IOleClientSite的所有方法都可以返回E_NOTIMPL。 一些IOleInPlaceSite和IOleWindow的方法需要一个实现来覆盖返回值。可以在示例代码中查看IOleInPlaceSite和IOleWindow的最小实现的样例代码。

既然我们已经完成了初始化的准备,让我们看一看浏览器控件自定义的每一个接口。

IDocHostUIHandler

IDocHostUIHandler自IE5以后已经是可用的。它提供15个方法。大体上,一些较重要的方法是IDocHostUIHandler::GetExternal, IDocHostUIHandler::GetHostInfo, IDocHostUIHandler::GetOptionKeyPath, IDocHostUIHandler::ShowContextMenu, 和 IDocHostUIHandler::TranslateAccelerator。当然,方法对你的重要性将会依赖于你的应用程序。

IDocHostUIHandler::GetHostInfo

你使用IDocHostUIHandler::GetHostInfo告诉MSHTML有关你的应用程序的能力和需求。通过它你能控制很多东西, 举例来说:

  • 你能禁用浏览器的3D的边缘。
  • 你能避免滚动条或改变他们的外观
  • 你能禁用脚本
  • 你能定义双击处理的方式
  • 你能禁用浏览器的自动完成功能

IDocHostUIHandler::GetHostInfo有一个参数,被 MSHTML分配的DOCHOSTUIINFO 结构的一个指针。你的工作要将结构中填充你传给MSHTML的信息。

DOCHOSTUIINFO结构有四个成员。第一个成员是 cbSize,是结构的大小。你应该自己像下面的示例代码那样设置。第二个成员是dwFlags,由来自DOCHOSTUIFLAG枚举的数值位与组成。第三成员是dwDoubleClick,来自DOCHOSTUIDBLCLK枚举的一个数值。第四个成员是pchHostCss。你可以将pchHostCss设定为浏览器控件显示的页面中应用的全局样式表(CSS)规则的一个字符串的指针。DOCHOSTUIINFO 的最后一个成员是pchHostNs。你可以设置为你提供的分号分隔的命名空间列表字符串。在你正在浏览器控件中显示的页上使用自定义标签的时候使用这一个成员。这样你能声明一个全局的命名空间列表,而不需要在每个显示声明他们。

确定使用CoTaskMemAlloc为pchHostCss或pchHostNS分配字符串译者注:看起来调用者用CoTaskMemFree释放这些字符串)。

例子

HRESULT GetHostInfo( DOCHOSTUIINFO* pInfo)

{

    WCHAR* szCSS = L"BODY {background-color:#ffcccc}";

    WCHAR* szNS = L"IE;MyTags;MyTags2='www.microsoft.com'";

    #define CCHMAX 256

    size_t cchLengthCSS,cchLengthszNS;

    HRESULT hr=StringCchLengthW(szCSS, CCHMAX,&cchLengthCSS)

    //TODO: 在这里处理错误。

    OLECHAR* pCSSBuffer=(OLECHAR*) CoTaskMemAlloc((cchLengthCSS+1)*sizeof(OLECHAR));

    //TODO: 在这里处理错误确定内存成功地被分配

    hr=StringCchLengthW(szNS, CCHMAX,&cchLengthszNS)

    //TODO: 在这里处理错误。

    OLECHAR* pNSBuffer=(OLECHAR*) CoTaskMemAlloc((cchLengthszNS+1)*sizeof(OLECHAR));

    //TODO: 在这里处理错误确定内存成功地被分配

    hr=StringCchCopyW(pCSSBuffer , cchLengthCSS+1,szCSS)

    //TODO: 在这里处理错误。

    hr=StringCchCopyW(pNSBuffer , cchLengthszNS+1,szNS)

    //TODO: 在这里处理错误。

    pInfo-> cbSize= sizeof(DOCHOSTUIINFO)

    pInfo-> dwFlags= DOCHOSTUIFLAG_NO3DBORDER|DOCHOSTUIFLAG_SCROLL_NO|DOCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE;

    pInfo-> dwDoubleClick= DOCHOSTUIDBLCLK_DEFAULT;

    pInfo-> pchHostCss= pCSSBuffer;

    pInfo-> pchHostNS= pNSBuffer;

    return S_OK;

}

如果你没有什么需要告诉MSHTML,你可以在这个方法中返回E_NOTIMPL 。

IDocHostUIHandler::ShowContextMenu

通过实现这一个方法, 你获得一个用户右击被浏览器控件显示的快捷菜单的控制。你能通过这个方法返回S_OK 阻止IE显示它的默认快捷菜单。返回一些其他的数值 , 像S_FALSE或E_NOTIMPL,允许IE继续执行它的默认快捷菜单行为。

如果你仅仅在这个方法中返回S_OK, 你能避免任何浏览器控件的右击行为。 这可能是你在许多场合中的全部需求,但是你能做更多。通常,你使用这一个方法在返回 S_OK 之前产生并且显示你自己的快捷菜单。如果你知道浏览器控件显示的菜单的资源,而且它如何选择他们,你能也有效地自定义默认的浏览器控件快捷菜单。让我们看看它如何工作

浏览器控件由Shdoclc.dll获得它的快捷菜单资源。这个知识和一些 #define给予你一个机会操纵浏览器的菜单。让我们举例来说,假定你对默认菜单感到满意,除了你想要除去查看代码之外。下列代码载入来自Shdoclc.dll的浏览器控件快捷菜单资源,根据环境选择正确的菜单,移除IDM_VIEWSOURCE命令应的菜单项,然后显示菜单

例子

HRESULT CBrowserHost::ShowContextMenu(DWORD dwID,

    POINT *ppt,

    IUnknown *pcmdTarget,

    IDispatch *pdispObject)

{

    #define IDR_BROWSE_CONTEXT_MENU 24641

    #define IDR_FORM_CONTEXT_MENU 24640

    #define SHDVID_GETMIMECSETMENU 27

    #define SHDVID_ADDMENUEXTENSIONS 53

    HRESULT hr;

    HINSTANCE hinstSHDOCLC;

    HWND hwnd;

    HMENU hMenu;

    CComPtr<IOleCommandTarget> spCT;

    CComPtr<IOleWindow> spWnd;

    MENUITEMINFO mii={0};

    CComVariant var, var1, var2;

    hr = pcmdTarget->QueryInterface(IID_IOleCommandTarget, (void**)&spCT);

    hr = pcmdTarget->QueryInterface(IID_IOleWindow, (void**)&spWnd);

    hr = spWnd->GetWindow(&hwnd);

    hinstSHDOCLC = LoadLibrary(TEXT("SHDOCLC.DLL"));

    if (hinstSHDOCLC == NULL)

    {

        // 载入模块错误 -- 尽可能安全地失败

        return;

    }

    hMenu=LoadMenu(hinstSHDOCLC,

        MAKEINTRESOURCE(IDR_BROWSE_CONTEXT_MENU));

    hMenu=GetSubMenu(hMenu,dwID);

    //获得语言子菜单

    hr = spCT->Exec(&CGID_ShellDocView, SHDVID_GETMIMECSETMENU, 0, NULL, &var);

    mii.cbSize = sizeof(mii);

    mii.fMask = MIIM_SUBMENU;

    mii.hSubMenu = (HMENU) var.byref;

    //加入语言子菜单到编码上下文菜单

    SetMenuItemInfo(hMenu, IDM_LANGUAGE, FALSE, &mii);

    //插入来自注册表的快捷菜单扩展

    V_VT(&var1) = VT_INT_PTR;

    V_BYREF(&var1) = hMenu;

    V_VT(&var2) = VT_I4;

    V_I4(&var2) = dwID;

    hr = spCT->Exec(&CGID_ShellDocView, SHDVID_ADDMENUEXTENSIONS, 0, &var1, &var2);

    //删除查看源代码

    DeleteMenu(hMenu, IDM_VIEWSOURCE, MF_BYCOMMAND);

    //显示快捷菜单

    int iSelection = ::TrackPopupMenu(hMenu,

        TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD,

        ppt->x,

        ppt->y,

        0,

        hwnd,

        (RECT*)NULL);

    //发送选定的快捷菜单项目指令到外

    LRESULT lr = ::SendMessage(hwnd, WM_COMMAND, iSelection, NULL);

    FreeLibrary(hinstSHDOCLC);

    return S_OK;

}

安全警告不正确地使用LoadLibrary能载入错误的动态链接库(DLL)来威胁你的应用程序的安全关于该如何正确地用微软Windows 的不同版本载入DLL的信息,参照LoadLibrary的文档

IDocHostUIHandler::GetExternal: 扩充文档对象模型

IDocHostUIHandler 提供一个让你用在你自己的应用程序中实现你自己的对象,方法和特性扩充IE文档对象模型 (DOM)的方法。你的实现是提供给MSHTML一个IDispatch接口指针,指向你自定义的COM自动化对象,实现你自定义的对象、属性和方法。这些对象,特性和方法之后可以在浏览器控件显示的任何页面中通过文档的外部对象访问

这一个方法的实现可以是非常简单的, 假定你的IDispatch接口在实现IDocHostUIHandler的相同对象上。

HRESULT CBrowserHost::GetExternal(IDispatch **ppDispatch)

{

    *ppDispatch = this;

    return S_OK;

}

只要 MSHTML有对你的 IDispatch 的一个指针,MSHTML将会传递网页上对任何外部对象的调用你的应用程序的自动化方法:

<SCRIPT language="JScript">

function MyFunc(iSomeData)

{

    external.MyCustomMethod("Some text", iSomeData);

}

</SCRIPT>

你也能使用这技术传递整个对象一个页。为了实现它,在你的IDispatch实现中创建一个方法,传递回你的网页可以用的对象。

<SCRIPT language="JScript">

function MyFunc(iSomeData)

{

    var oCustCalendarObj;

    external.GetCustomCalender(oCustCalenderObj);

    oCustCalerdarObj.doStuffWithIt();

.

.

.

}

</SCRIPT>

可以看看示例代码中使用 ATLIDispatch自动化实现的一个例子 。

译者注:IE也扩展了浏览器的文档对象模型,使得你在脚本中可以通过扩展对象menuArguments属性访问当前窗口对象。

IDocHostUIHandler::GetOptionKeyPath

IDocHostUIHandler::GetOptionKeyPath是自定义浏览器控件的一个非常有力的工具。 许多浏览器控件显示行为设定被储存在注册表中HKEY_CURRENT_USER键的下面。IDocHostUIHandler::GetOptionKeyPath给你一个机会为你的浏览器控件的特定实例覆盖这些注册表设定。它通过提供一个替代的注册表位置来实现,浏览器控件将会在这里读取注册表设置

IDocHostUIHandler::GetOptionKeyPath的一个实现传递给浏览器控件读取注册表设置的位置的一个字符串。浏览器控件将会找寻在HKEY_CURRENT_USER键下面的这一个键。

例子

HRESULT CBrowserHost::GetOptionKeyPath(LPOLESTR *pchKey,

    DWORD dwReserved)

{

    HRESULT hr;

    #define CCHMAX 256

    size_t cchLength;

    if (pchKey)

    {

        WCHAR* szMyKey = L"Software/MyCompany/MyApp";

        hr = StringCchLengthW(szMyKey, CCHMAX, &cchLength);

        //TODO: 在这里处理错误。

        *pchKey = (LPOLESTR)CoTaskMemAlloc((cchLength + 1) * sizeof(WCHAR));

        if (*pchKey)

            hr = StringCchCopyW(*pchKey, cchLength + 1, szKey);

        //TODO: 在这里处理错误。

        hr = (*pchKey) ? S_OK : E_OUTOFMEMORY;

    }

    else

        hr = E_INVALIDARG;

    return hr;

}

IDocHostUIHandler::GetHostInfo一样,确保为你的字符串使用 CoTaskMemAlloc分配内存。

告诉浏览器控件该哪里找寻你的注册表设置实际上是第一步——就程序运行来说第二步。 你的程序必须在被IDocHostUIHandler::GetOptionKeyPath告诉的位置设置一个注册表,这样浏览器控件才可以去读取。有多种方法来完成这个步骤一个方法是当应用程序被安装的时候执行一个注册表脚本。另外的一个方法当应用程序启动的时候,用代码来完成。这里是改变默认值字体,大小和颜色的一个设定。

例子

HRESULT SetSomeKeys()

{

    HKEY hKey = NULL;

    HKEY hKey2 = NULL;

    HKEY hKey3 = NULL;

    DWORD dwDisposition = NULL;

    LONG lResult = NULL;

    #define CBMAX 256

    size_t cbLength;

    RegCreateKeyEx(HKEY_CURRENT_USER, _T("Software/MyCompany/MyApp"),

        NULL, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE,

        NULL, &hKey, &dwDisposition);

    RegCreateKeyEx(hKey, _T("Main"), NULL, NULL, REG_OPTION_NON_VOLATILE,

        KEY_SET_VALUE, NULL, &hKey2, &dwDisposition);

    RegSetValueEx(hKey2, _T("Use_DlgBox_Colors"), NULL, REG_SZ,

        (CONST BYTE*)_T("no"), sizeof(_T("no")));

    RegCloseKey(hKey2);

    RegCreateKeyEx(hKey, _T("Settings"), NULL, NULL, REG_OPTION_NON_VOLATILE,

        KEY_SET_VALUE, NULL, &hKey2, &dwDisposition);

    RegSetValueEx(hKey2, _T("Anchor Color"), NULL, REG_SZ,

        (CONST BYTE*)_T("0,255,255"), sizeof(_T("0,255,255")));

    RegSetValueEx(hKey2, _T("Text Color"), NULL, REG_SZ,

        (CONST BYTE*)_T("255,0,255"), sizeof(_T("255,0,255")));

    RegCloseKey(hKey2);

    RegCreateKeyEx(hKey, _T("International/Scripts"), NULL, NULL,

        REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL,

        &hKey2, &dwDisposition);

    BYTE bDefaultScript = 0x3;

    RegSetValueEx(hKey2, _T("Default_Script"), NULL, REG_BINARY,

        &bDefaultScript, sizeof(bDefaultScript));

    RegCreateKeyEx(hKey2, _T("3"), NULL, NULL, REG_OPTION_NON_VOLATILE,

        KEY_SET_VALUE, NULL, &hKey3, &dwDisposition);

    BYTE bSize = 0x4; // Value from 0 - 4. 2 is medium.

    TCHAR* szFontName = _T("Comic Sans MS");

    TCHAR* szFixedFontName = _T("Courier");

    HRESULT hr = StringCbLength(szFontName, CBMAX, &cbLength);

    //TODO: 在这里处理错误。

    RegSetValueEx(hKey3, _T("IEPropFontName"), NULL, REG_SZ,

        (CONST BYTE*)szFontName, cbLength + sizeof(TCHAR));

    hr = StringCbLength(szFixedFontName, CBMAX, &cbLength);

    //TODO: 在这里处理错误。

    RegSetValueEx(hKey3, _T("IEFixedFontName"), NULL, REG_SZ,

        (CONST BYTE*)szFixedFontName, cbLength + sizeof(TCHAR));

    RegSetValueEx(hKey3, _T("IEFontSize"), NULL, REG_BINARY, &bSize, sizeof(bSize));

    RegCloseKey(hKey3);

    RegCloseKey(hKey2);

    RegCloseKey(hKey);

    return S_OK;

}

IDocHostUIHandler2

IDocHostUIHandler2 只有一个方法,IDocHostUIHandler2::GetOverrideKeyPath。它运行非常类似于IDocHostUIHandler::GetOptionKeyPath的一个功能。它指出你修改自默认注册表设置的集成浏览器使用的注册表设置的位置。IDocHostUIHandler2::GetOverrideKeyPath 的一个实现看起来会很类似于IDocHostUIHandler::GetOptionKeyPath的一个实现。

GetOptionKeyPath 和 GetOverrideKeyPath 比较

你或许没看到IDocHostUIHandler::GetOptionKeyPath和IDocHostUIHandler2::GetOverrideKeyPath之间的任何不同。在他们之间的不同是微妙的, 但是重要的。如果你实现 IDocHostUIHandler::GetOptionKeyPath,你的浏览器控件实例将会忽略任何IE用户设定。这些设定被储存在注册表HKEY_CURRENT_USER/Software/Microsoft/Internet Explorer下面。如果你实现IDocHostUIHandler2::GetOverrideKeyPath,你的浏览器控件实例将会合并任何的用户设定—字体设定,菜单扩展,诸如此类——到显示和行为中

举例说明在IDocHostUIHandler::GetOptionKeyPath和IDocHostUIHandler2::GetOverrideKeyPath之间的不同,让我们重新看看IDocHostUIHandler::ShowContextMenu那段的示例代码记住这一行:

spCT->Exec(&CGID_ShellDocView, SHDVID_ADDMENUEXTENSIONS, 0, &var1, &var2);

如果你已经实现IDocHostUIHandler::GetOptionKeyPath,因为菜单扩展信息被储存在当前用户的注册表信息中,所以这一加入任何自定义项目到快捷菜单。如果你已经实现IDocHostUIHandler2::GetOverrideKeyPath, 这一个添加在HKEY_CURRENT_USER/Software/Microsoft/Internet Explorer/MenuExt面定义的任何目前用户定义的菜单扩展, 除非你明确地在你的自定义注册信息位置提供一个空的或替代的MenuExt键。

控制导航

你可能想知道在IDocHostUIHandler那一节为什么不提到 IDocHostUIHandler::TranslateUrl,作为希望制页面导航实现方法。原因是这一个方法不是控制导航通用的技术。 除非你直接地集成MSHTML,这一个方法将没有控制导航的效果。作为替代,通过实现IDispatch::Invoke,处理DISPID_BEFORENAVIGATE2,你可以控制导航。例如,下列代码避免导航一个特别的网址,如果使用者尝试这么做,会显示 "没有允许导航" 错误页。

例子

case DISPID_BEFORENAVIGATE2:

{

    CComBSTR url = ((*pDispParams).rgvarg)[5].pvarVal->bstrVal;

    if (url == "http://www.adatum.com" || url == "http://www.adatum.com/")

    {

        CComPtr<IWebBrowser2> spBrowser;

        CComPtr<IDispatch> spDisp = ((*pDispParams).rgvarg)[6].pdispVal;

        spDisp->QueryInterface(IID_IWebBrowser2, (void**)&spBrowser);

        spBrowser->Stop();

        CComBSTR newURL = "L"res://webhost.exe/nonavigate.htm";

        spBrowser->Navigate(newURL, NULL, NULL, NULL, NULL);

        ((*pDispParams).rgvarg)[0].boolVal = TRUE;

    }

    break;

}

IDocHostShowUI

这个接口给你对浏览器控件显示信息对话框和帮助的控制。它工作机理和IDocHostUIHandler和IDocHostUIHandler2一样,你实现它,这样在浏览器控件显示它自己的任何的信息或帮助之前 ,能调用你的IDocHostShowUI方法。这给你一个机会阻止浏览器控件显示任何东西,而且使你能够改为显示你自己的自定义信息或帮助。 IDocHostShowUI有两个方法,IDocHostShowUI::ShowMessage和IDocHostShowUI::ShowHelp。

IDocHostShowUI::ShowMessage

返回 S_OK禁用浏览器控件信息对话框。任何其他的返回数值,像S_FALSE或E_NOTIMPL,允许浏览器控件显示它的信息对话框

通过这个方法能做的一件事情是为你的应用程序自定义信息框标题,替代 "Microsoft Internet Explorer" 。你能通过比较lpstrCaption和储存在Shdoclc.dll中的IE使用的字符串资源来完成它。它的ID是IDS_MESSAGE_BOX_TITLE,数值是2213。下列示例代码演示你可能需要做的工作

例子

HRESULT CBrowserHost::ShowMessage(HWND hwnd,

    LPOLESTR lpstrText,

    LPOLESTR lpstrCaption,

    DWORD dwType,

    LPOLESTR lpstrHelpFile,

    DWORD dwHelpContext,

    LRESULT *plResult)

{

    USES_CONVERSION;

    TCHAR pBuffer[50];

    // 窗口标题"Microsoft Internet Explorer"的资源标识

    #define IDS_MESSAGE_BOX_TITLE 2213

    //载入Shdoclc.dll IE消息框标题字符串

    HINSTANCE hinstSHDOCLC = LoadLibrary(TEXT("SHDOCLC.DLL"));

    if (hinstSHDOCLC == NULL)

    {

        // 载入模块错误 -- 尽可能安全地失败

        return;

    }

    LoadString(hinstSHDOCLC, IDS_MESSAGE_BOX_TITLE, pBuffer, 50);

    // 比较IE消息框标题字符串和lpstrCaption

    // 如果相同,用自定义标题替换

    if (_tcscmp(OLE2T(lpstrCaption), pBuffer) == 0)

        lpstrCaption = L"Custom Caption";

    // 创建自己的消息框并且显示

        *plResult = MessageBox(OLE2T(lpstrText), OLE2T(lpstrCaption), dwType);

    //卸载Shdoclc.dll并且返回

    FreeLibrary(hinstSHDOCLC);

    return S_OK;

}

安全警告不正确地使用LoadLibrary能载入错误的动态链接库(DLL)来威胁你的应用程序的安全关于该如何正确地用微软Windows的不同版本载入DLL的信息,参照 LoadLibrary的文档

IDocHostShowUI::ShowHelp

这一个方法当IE需要显示帮助时被调用,举例来说当 F1 键被按下时,而且工作方式和IDocHostShowUI::ShowMessage类似。返回S_OK覆盖IE的帮助,或另外的HRESULT值IE执行自己的帮助

控制下载和执行

浏览器控件给你它下载,显示设置和执行的控制。 为了要得到这控制,你实现你的宿主的IDispatch接口,使得它处理DISPID_AMBIENT_DLCONTROL。当浏览器控件被实例化的时候,它将会以这一个ID调用你的IDispatch::Invoke。将pvarResult设置为下列的标识的一个位与的组合,指明你的配置

  • DLCTL_DLIMAGES , DLCTL_VIDEOS 和 DLCTL_BGSOUNDS: 如果这些标识被设定图像,视频背景音乐将会被从服务器下载并且显示或播放,否则将不被下载显示。
  • DLCTL_NO_SCRIPTS 和 DLCTL_NO_JAVA: 脚本Java程序将不被运行。
  • DLCTL_NO_DLACTIVEXCTLS 和 DLCTL_NO_RUNACTIVEXCTLS: ActiveX 控件将不被下载或者运行。
  • DLCTL_DOWNLOADONLY: 网页只将会被下载,不显示。
  • DLCTL_NO_FRAMEDOWNLOAD:浏览器控件将会下载并且解析框架集页面,但是不会下载和解析框架集中单独的框架。
  • DLCTL_RESYNCHRONIZE 和 DLCTL_PRAGMA_NO_CACHE: 这些标志导致Internet缓冲的刷新。通过 DLCTL_RESYNCHRONIZE,服务器将会被请求更新状态。如果服务器指出缓存信息是最新的,将会使用 缓存文件。通过DLCTL_PRAGMA_NO_CACHE,不管文件的更新状态如何,文件都会被从服务器重新下载。
  • DLCTL_NO_BEHAVIORS: 行为不被下载并且在文件中被禁用。
  • DLCTL_NO_METACHARSET_HTML: 忽略META元素中指明的字符集
  • DLCTL_URL_ENCODING_DISABLE_UTF8 和 DLCTL_URL_ENCODING_ENABLE_UTF8: 这些标志的功能类似于IDocHostUIHandler::GetHostInfo使用DOCHOSTUIFLAG_URL_ENCODING_DISABLE_UTF8 DOCHOSTUIFLAG_URL_ENCODING_ENABLE_UTF8标志。不同是只有浏览器控件被初始化的时候,DOCHOSTUIFLAG标志才会被检查。这里的环境特性变化下载标志每当浏览器控件需要运行一个下载被检查。
  • DLCTL_NO_CLIENTPULL: 不运行客户端重定位页面操作(译者注:例如<meta http-equiv="refresh" content="30"> 的默认行为)
  • DLCTL_SILENT: 在下载期间没有用户界面显示。
  • DLCTL_FORCEOFFLINE: 浏览器控件总是在脱机模式中操作。
  • DLCTL_OFFLINEIFNOTCONNECTED 和 DLCTL_OFFLINE: 这些标志是相同的。如果不连接到英特网浏览器控件将会在脱机模式中操作。

DISPID_AMBIENT_DLCONTROL和标志数值在mshtmdid.h被定义

最初,当对IDispatch::Invoke调用开始的时候, pvarResult参数指向的VARIANTVT_EMPTY类型。 你必须为任何有效的设定设置它为VT_I4类型。你可以在VARIANT的lVal成员中存储标志数值。

大部份标志数值有否定的效果,也就是说,他们避免行为正常地发生。举例来说,如果你自定义浏览器控件行为,那么通常脚本会被执行。 但是如果你设定DLCTL_NOSCRIPTS 标志,脚本将不会在控制的那个实例中运行。然而,三标志— DLCTL_DLIMAGES , DLCTL_VIDEOS 和 DLCTL_BGSOUNDS的作用正好相反。你必须全部设置标志,使得浏览器控件以它的默认行为执行关于图像,视频和声音的处理。

下列示例代码使得一个浏览器控件实例下载并且显示图像和视频,但是不处理背景音乐,因为DLCTL_BGSOUNDS没有被明确地设定。浏览器控件显示的页上脚本运行被禁用

例子

STDMETHODIMP CAtlBrCon::Invoke(DISPID dispidMember, REFIID riid,

    LCID lcid, WORD wFlags,

    DISPPARAMS* pDispParams,

    VARIANT* pvarResult,

    EXCEPINFO* pExcepInfo,

    UINT* puArgErr)

{

    switch (dispidMember)

    {

        case DISPID_AMBIENT_DLCONTROL:

            pvarResult->vt = VT_I4;

            pvarResult->lVal = DLCTL_DLIMAGES | DLCTL_VIDEOS | DLCTL_NO_SCRIPTS;

            break;

        default:

            return DISP_E_MEMBERNOTFOUND;

    }

    return S_OK;

}

IHostDialogHelper

IHostDialogHelper是一个你能根据你的爱好创建对话框的接口。这一个接口有一个方法,IHostDialogHelper::ShowHTMLDialog。这一个方法提供如同功能ShowHTMLDialog一般的服务,但是使用起来稍微比较容易一点

为了要使用IHostDialogHelper,你从头产生对话框辅助对象。在这里是你使用CoCreateInstance的方式创建它。接口和ID在 mshtmhst.h 被定义。

例子

IHostDialogHelper* pHDH;

IMoniker* pUrlMoniker;

BSTR bstrOptions = SysAllocString(L"dialogHeight:30;dialogWidth:40");

BSTR bstrPath = SysAllocString(L"c:/dialog.htm");

CreateURLMoniker(NULL, bstrPath, &pUrlMoniker);

// 创建对话框辅助对象

CoCreateInstance(CLSID_HostDialogHelper,

    NULL,

    CLSCTX_INPROC,

    IID_IHostDialogHelper,

    (void**)&pHDH);

//调用ShowHTMLDialog 创建对话框

pHDH->ShowHTMLDialog(NULL,

    pUrlMoniker,

    NULL,

    bstrOptions,

    NULL,

    NULL);

//释放资源

SysFreeString(bstrPath);

SysFreeString(bstrOptions);

pUrlMoniker->Release();

pHDH->Release();

译者注:如果要使用对话框来获得用户输入,你可能需要传递两个参数到ShowHTMLDialog。关于ShowHTMLDialog参数的说明,参见Platform SDK文档。ShowHTMLDialog和ShowHTMLDialogEx 似乎一直是MSHTML.DLL导出的两个函数,微软把它封装为接口,可能是在为未来的兼容性作准备。

控制新的窗口

控制浏览器控件的一个重要的方法控制导航。你在前面已经看如何在IDispatch::Invoke中拦截DISPID_BEFORENAVIGATE2实现控制你的浏览器控件导航位置。另外一个导航的重要的方面要控制导航发生方式, 尤其打开新的窗口的时候。让我们举例来说, 使用者右击一个链接,选择 "在新窗囗中打开" 或一页包含像这样的脚本:

window.open("www.msn.com")

默认地,浏览器控件行代码的处理通过打开IE的一个新的实例来显示页。这可能正好是你的应用程序需要的但是也可能不是。也许你需要在当前的浏览器控件实例中打开所有链接,你将在你控制下的浏览器控件的一个新的实例——具有你的用户界面和你的商标——打开链接

可以在你的IDispatch实现中拦截一个事件——DWebBrowserEvents2::NewWindow2——来控制。你的控制需要连接到DWebBrowserEvents2连接点拦截这一个事件。

你连接到DWebBrowserEvents2之后,实现你的IDispatch::Invoke以处理 DISPID_NEWWINDOW2。在为DISPID_NEWWINDOW2IDispatch::Invoke函数调用中,数组pDispParams包含两个参数。第一个,序号是零, 是一个布尔类型的数值,告诉浏览器控件是否取消新的窗囗。默认它是假值,而且将会打开一个新的窗囗。如果你要完全取消新窗囗的创建, 设定标志到真值。

序号为一的参数是一个IDispatch接口的指针。你可以将这一个参数设定为你已经创建的浏览器控件的IDispatch。当你传回这样一个IDispatch之后,MSHTML将会使用你给出的控件打开链接

译者注:MFC中的DHTML类和类向导默认支持这个事件。需要更多信息的话,参见MSJ1998年7月份的文章Keeping an Eye on Your Browser by Monitoring Internet Explorer 4.0 Events,以及 微软知识库文章 Q184876 HOWTO: Use the WebBrowser Control NewWindow2 Event

结论

你现在有许多技术,可以根据你的处理来自定义浏览器控件。这个文章决不是没有遗漏的,但是希望现在可以自行发现超越本文的技术。检查IE注册表设置中那些你可以用IDocHostUIHandler::GetOptionKeyPath或IDocHostUIHandler2::GetOverrideKeyPath修改的信息。记住许多注册表设置相互依赖。你可能必须做一些实验发现注册表设置可以多么的有效地自定义;如果需要控制浏览器控件的拖放行为,你也可以去看看IDocHostUIHandler::GetDropTarget。

 

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 微信开发者工具跨域问题

    如何不用将前端代码上传到远程服务器,也能够在本地进行远程调试?(解决跨域问题)解决1、修改路径将安装好的“微开发者工具”移动到没有中文路径的地址,然后将“微信开发者工具.exe” 更改为英文名字,然后发送到桌面快捷方式2、修改名称右击开发者工具快捷方式 -> 点击属…...

    2024/5/9 12:06:05
  2. 让C代码在浏览器中运行——WebAssembly入门介绍

    WebAssembly作为一种新兴的Web技术,相关的资料和社区还不够丰富,但其为web开发提供了一种崭新的思路和工作方式,未来是很有可能大放光彩的。使用WebAssembly,我们可以在浏览器中运行一些高性能、低级别的编程语言,可用它将大型的C和C++代码库比如游戏、物理引擎甚至是桌面…...

    2024/5/9 23:15:05
  3. 运营商造势 CP、SP发力手机游戏

    因3G而激发起来的无线互联网的朦胧愿景,正驱使几年前还是小众市场的手机游戏市场扩张为一个庞大的产业族群。尽管在商业模式、分成机制、平台开放、移动带宽等方面还存在诸多不确定性,但包括开发商、发行商、运营商、网络运营商、平台提供商、设备制造商在内,整个手机游戏产…...

    2024/5/6 23:40:29
  4. Axure RP 8 教程 - 查看原型

    Axure小白的福利又来了,本教程主要讲述查看原型的一系列基础操作以及相关设置。希望大家边学边操作,学习效果更佳哦。Axure RP 8 教程 - 查看原型1.快速预览查看原型快速原型的快捷键为“F5”。或者,单击快捷键功能中的预览图标进行预览。导航菜单“发布”-“预 览选项”中进…...

    2024/4/19 22:59:57
  5. 2019本科se第一次作业-博客初体验

    Deadline:2019-9-14 23:00,以博客发表日期为准 评分标准:按时交 - 有分(满分100分),超期提交本次作业为0分,2周内未完成倒扣本次作业分数 检查项目包括:完成任务1(10分)完成任务2(10分)完成任务3(70分)博文规范(行文清晰流畅)(10分)抄袭 - 倒扣本次作业分数 任…...

    2024/5/9 6:46:21
  6. 微信开发者工具无法打开界面的解决办法

    遇到的问题:最近几天没关电脑,发现微信开发者工具非常卡顿,于是重启了一下开发者工具,这一重启不要紧,连续好几次都打不开了,查看任务管理器,发现有一大堆微信开发者工具的进程,所以程序是应该运行了,但是界面没打开..上网查了一下,重启系统,重装开发者工具一般是能解决该问题的…...

    2024/4/18 3:37:32
  7. 最新浏览器速度测试

    各种浏览器FireFox,IE,Opera,Safari都发布了新版本,都号称自己的是最快的浏览器。我们来测试一下,看看到底谁启动最快,谁使用更少的内存,谁支持动态界面比如Gmail更快。我们使用了一些不那么科学,但是快速有效的方式来测试。测试系统 我们测试了各个浏览器的最新版本:…...

    2024/5/6 6:15:47
  8. 201671010415+金生芳+作业互评与改进报告

    任务一:从班级博客园的以下班级的软件工程第一次作业中各选一篇学生博文作业进行阅读并进行评论 对2019级春季计算机学院软件工程(罗杰)(北京航空航天大学)素朴拉斯软件工程第0次作业进行阅读并进行评论。 博客地址:https://www.cnblogs.com/zuoshun/p/10438399.html读完…...

    2024/5/8 3:13:57
  9. 解决【微信开发者工具】调试【企业微信】自建应用网页出现未绑定企业号开发者

    强调一下:微信开发者工具可以调试企业微信的自建应用,暂时还不支持调试第三方应用。调试第三方应用时同样也会提示未绑定企业号开发者。下面将针对如何调试自建应用出现的企业号未绑定问题。1、首先,将自己设置为企业微信的管理员。2、进入企业微信---我的企业---微工作台--…...

    2024/5/7 0:45:25
  10. Axure8.0基础教程(1-10)AxureRP8实战手册

    本文转载自小楼老师博客:http://www.iaxure.com/3768.html Axure新手必须掌握的56个基础操作。基础操作篇本篇包含56种常见的基础操作,初学者应在掌握本篇内容后再进行实战案例篇的学习,以免产生学习障碍。同时,建议具备一定基础的读者学习本篇中相对生疏的内容,并加以掌握…...

    2024/4/18 3:38:02
  11. 互联网人物点评之一

    互联网人物点评之一 文/飞天含雪 qq 543415188 一. 张朝阳----互联网界的"舞美师"--------搜狐公司董事局主席兼首席执行官 如果要在互联网界找出谁能与张朝阳的"作秀"能力想匹敌,实为难矣!清华大学的本科生涯,麻省理工的留学背景,或多或少都给予张朝阳…...

    2024/4/18 8:28:38
  12. Axure 7.0教程_小楼作品(十六)多值单变量的页面传值

    axure7.0教程_小楼作品(十六)多值单变量的页面传值作者: 小楼一夜听春语 分类: Axure7.0教程 时间: 2013-08-20 12:00 ė4,822 浏览数 62条评论今天这篇Axure教程,主要讲的是字符串函数的应用。在我们做一些Axure原型的时候,经常需要实现在两个或多个页面传递一些信息的效果…...

    2024/5/9 0:42:02
  13. 【2012年终总结】之一 opencv + ds采集摄像头视频 MFC点点滴滴

    1、MFC单文档多文档程序 不让MFC来更新菜单 1 在CMainFrame::CMainFrame中添加 2 3 m_bAutoMenuEnable = FALSE; 标题栏图标的更改 1 //cuihao, 标题栏图标; 2 CCameraMonitorApp *pApp = (CCameraMonitorApp*)AfxGetApp(); 3 HICON hIcon = pApp->LoadIcon(IDI_ICON3); 4 …...

    2024/4/12 0:27:09
  14. 微信开发者工具调试微信网页授权,点击‘登录’按钮无效

    微信开发者工具调试微信网页授权,点击‘登录’按钮无效 问题描述 h5页面需要获取微信用户信息,参考 微信开发者文档,一步步走到用开发者工具调试页面,却发现点击登录按钮没有反应!如下看日志信息好吧,说这个图片路径是http,而应该是https,可是这是微信自己的页面啊,怎…...

    2024/5/8 4:44:24
  15. 各大浏览器兼容性报告

    IE、FF、Safari、OP不同浏览器兼容报告分类: UI前端設計2011-12-0517:01 323人阅读 评论(0) 收藏 举报 IE、FF、Safari、OP不同浏览器兼容报告1 浏览器内核简介 TridentIE浏览器(GreenBrowser绿色浏览器, 遨游浏览器....都是IE)GeckosFireFoxPrestoOperaWebkitSafari、…...

    2024/4/18 3:47:38
  16. 网络营销策略

    有一位小有名气的广告制片人名叫托尼查理,工作以外的业余时间,就是上网炒股,胜算多于失算,于是俨然以投资天才自居,到处炫耀。但始自4月4日的股灾无情地将他股市上的投 资缩水30%多。这次他恍然大悟:“市场行情好的时候,总觉得自己是投资高手;现在市场 跌了,才认识到我…...

    2024/4/20 4:20:14
  17. 20145220韩旭飞第五周博客

    20145220韩旭飞第五周博客 敬爱的娄老师,我是20145220韩旭飞,经过这几周的学习,我认识到自己存在很大的问题, 首先我没有认真完成您要求的博客,敷衍了事。所以导致我的每周成绩十分的低,通过您与我们的对话,我充分认识到了,我需要努力学习这门课程,每周的博客自己认真…...

    2024/4/18 3:48:44
  18. ubuntu20下使用微信开发者工具

    发现一个可以在linux下使用的微信开发者工具,安装方法看官方文档,需要安装winelinux微信开发者工具...

    2024/4/18 3:52:34
  19. Axure PR的使用

    1759139 王越Axure RP是美国Axure Software Solution公司旗舰产品,是一个专业的快速原型设计工具,让负责定义需求和规格、设计功能和界面的专家能够快速创建应用软件或Web网站的线框图、流程图、原型和规格说明文档。作为专业的原型设计工具,它能快速、高效的创建原型,同时…...

    2024/4/18 3:47:51
  20. C语言自学完备手册(19)——冒泡排序

    自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onLayout源码详尽分析 自定义View系列教程04–Draw源码分析及其实践 自定义View系列教程05–示例分析 自定义V…...

    2024/5/9 6:19:07

最新文章

  1. 【go项目01_学习记录07】

    学习记录 1 创建博文1.1 在main.go中添加路由1.2 构建表单 2 读取表单数据2.1 完善articlesStoreHandler() 函数2.2 修改代码&#xff0c;查看区别 3 表单验证3.1 数据验证3.2 出错提示 1 创建博文 1.1 在main.go中添加路由 访问http://localhost:3000/articles/create 1.2 …...

    2024/5/10 4:00:20
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/9 21:23:04
  3. Web大并发集群部署之集群介绍

    一、传统web访问模型 传统web访问模型完成一次请求的步骤 1&#xff09;用户发起请求 2&#xff09;服务器接受请求 3&#xff09;服务器处理请求&#xff08;压力最大&#xff09; 4&#xff09;服务器响应请求 传统模型缺点 单点故障&#xff1b; 单台服务器资源有限&…...

    2024/5/9 23:42:02
  4. 权限提升-Linux系统权限提升篇VulnhubRbash绕过DockerLXD容器History泄漏shell交互

    知识点 1、普通用户到Linux-泄漏-History 2、普通用户到Linux-限制-Rbash绕过 3、普通用户到Linux-容器-LXD&Docker 4.Linux系统提权-web/普通用户-docker逃逸&提权&shell交互 章节点&#xff1a; 1、Web权限提升及转移 2、系统权限提升及转移 3、宿主权限提升及…...

    2024/5/9 4:22:56
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/8 6:01:22
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/9 15:10:32
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/9 4:20:59
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/7 11:36:39
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/6 1:40:42
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/8 20:48:49
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/7 9:26:26
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/8 19:33:07
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/5 8:13:33
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/8 20:38:49
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/9 7:32:17
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/9 17:11:10
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57