如何禁用对 VisualC++ 中 CHtmlView 默认弹出式菜单

点击这里察看该文章的英文版: 236312 ([url]http://support.microsoft.com/kb/236312/en-us/)[/url]
文章编号 : 236312
最后修改 : 2006年11月21日
修订 : 3.1
本页

概要

更多信息

步骤来禁用默认弹出式菜单

参考
概要
创建默认 CHtmlView Appwizard 应用。 当您右键单击 MicrosoftInternetExplorer, 中任何 Web 站点上出现默认弹出菜单。 fromMicrosoft driller (MFC) 示例说明如何为 WebBrowser 控件替代此行为因此不显示该弹出菜单。 如果不希望用户能够查看 Web页面的源代码或属性, 或使用其他功能如后退和前进按钮, 可能禁用该弹出菜单。 或者, 如果要自己功能添加到弹出菜单, 必须也禁用默认弹出菜单。

注意 Driller (MFC) 示例说明如何对 WebBrowser 控件替代此行为。 它不使用 CHtmlView 类。
回到顶端

更多信息
本文是基于 Driller (MFC) 示例, 该可从以下 MicrosoftWeb 站点获取:
[url]http://msdn.microsoft.com/downloads/samples/Internet/browser/driller/Default.asp[/url] ([url]http://msdn.microsoft.com/downloads/samples/Internet/browser/driller/Default.asp)[/url]
driller 包括用于 Custsite.h Custsite.cpp、 Idispimp.h 和 Idispimp.cpp 此处代码。 Internet Explorer 4 和 Internet Explorer 5 中支持这些方法。
回到顶端

步骤来禁用默认弹出式菜单
1. 创建应用程序向导生成的 SDI 应用程序调用 MySample。 在步骤 6 / 6 更改到 CHtmlView。  
2. 打开 MySample.h 并如下所示到 CMySampleApp 类添加公共成员变量: public:
         class CImpIDispatch* m_pDispOM;
                                       

3. 向项目称为 " Custsite.h " 添加新头文件。 以下代码复制并粘贴到它: //=--------------------------------------------------------------------------=
//  (C) Copyright 1996-1999 Microsoft Corporation. All Rights Reserved.
//=--------------------------------------------------------------------------=
#ifndef __CUSTOMSITEH__
#define __CUSTOMSITEH__

#include "idispimp.h"
#include <mshtmhst.h>

//
// NOTE:
// Some of the code in this file is MFC implementation specific.
// Changes in future versions of MFC implementation may require
// the code to be changed. Please check the readme of this
// sample for more information
//

class CCustomControlSite:public COleControlSite
{
public:
        CCustomControlSite(COleControlContainer *pCnt):COleControlSite(pCnt){}

protected:

        DECLARE_INTERFACE_MAP();
BEGIN_INTERFACE_PART(DocHostUIHandler, IDocHostUIHandler)
        STDMETHOD(ShowContextMenu)(/* [in] */ DWORD dwID,
            /* [in] */ POINT __RPC_FAR *ppt,
            /* [in] */ IUnknown __RPC_FAR *pcmdtReserved,
            /* [in] */ IDispatch __RPC_FAR *pdispReserved);
        STDMETHOD(GetHostInfo)(
            /* [out][in] */ DOCHOSTUIINFO __RPC_FAR *pInfo);
        STDMETHOD(ShowUI)(
            /* [in] */ DWORD dwID,
            /* [in] */ IOleInPlaceActiveObject __RPC_FAR *pActiveObject,
            /* [in] */ IOleCommandTarget __RPC_FAR *pCommandTarget,
            /* [in] */ IOleInPlaceFrame __RPC_FAR *pFrame,
            /* [in] */ IOleInPlaceUIWindow __RPC_FAR *pDoc);
        STDMETHOD(HideUI)(void);
        STDMETHOD(UpdateUI)(void);
        STDMETHOD(EnableModeless)(/* [in] */ BOOL fEnable);
        STDMETHOD(OnDocWindowActivate)(/* [in] */ BOOL fEnable);
        STDMETHOD(OnFrameWindowActivate)(/* [in] */ BOOL fEnable);
        STDMETHOD(ResizeBorder)(
            /* [in] */ LPCRECT prcBorder,
            /* [in] */ IOleInPlaceUIWindow __RPC_FAR *pUIWindow,
            /* [in] */ BOOL fRameWindow);
        STDMETHOD(TranslateAccelerator)(
            /* [in] */ LPMSG lpMsg,
            /* [in] */ const GUID __RPC_FAR *pguidCmdGroup,
            /* [in] */ DWORD nCmdID);
        STDMETHOD(GetOptionKeyPath)(
            /* [out] */ LPOLESTR __RPC_FAR *pchKey,
            /* [in] */ DWORD dw);
        STDMETHOD(GetDropTarget)(
            /* [in] */ IDropTarget __RPC_FAR *pDropTarget,
            /* [out] */ IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget);
    STDMETHOD(GetExternal)(
            /* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch);
    STDMETHOD(TranslateUrl)(
            /* [in] */ DWORD dwTranslate,
            /* [in] */ OLECHAR __RPC_FAR *pchURLIn,
            /* [out] */ OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut);
    STDMETHOD(FilterDataObject)(
            /* [in] */ IDataObject __RPC_FAR *pDO,
            /* [out] */ IDataObject __RPC_FAR *__RPC_FAR *ppDORet);
END_INTERFACE_PART(DocHostUIHandler)
};


class CCustomOccManager :public COccManager
{
public:
        CCustomOccManager(){}
        COleControlSite* CreateSite(COleControlContainer* pCtrlCont)
        {
                CCustomControlSite *pSite = new CCustomControlSite(pCtrlCont);
                return pSite;
        }
};

#endif
                                               

4. 添加新 CPP 文件称为 " Custsite.cpp " 并添加到下面代码: //=--------------------------------------------------------------------------=
//  (C) Copyright 1996-1999 Microsoft Corporation. All Rights Reserved.
//=--------------------------------------------------------------------------=


//
// NOTE:
// Some of the code in this file is MFC implementation specific.
// Changes in future versions of MFC implementation may require
// the code to be changed. Please check the readme of this
// sample for more information
//

#include "stdafx.h"
#undef AFX_DATA
#define AFX_DATA AFX_DATA_IMPORT
#include "MySample.h"


// NOTE: This line is a hardcoded reference to an MFC header file
//  this path may need to be changed to refer to the location of VC5 install
//  for successful compilation.


#include <..srcoccimpl.h>
#undef AFX_DATA
#define AFX_DATA AFX_DATA_EXPORT
#include "custsite.h"



BEGIN_INTERFACE_MAP(CCustomControlSite, COleControlSite)
        INTERFACE_PART(CCustomControlSite, IID_IDocHostUIHandler, DocHostUIHandler)
END_INTERFACE_MAP()

       

ULONG FAR EXPORT  CCustomControlSite::XDocHostUIHandler::AddRef()
{
        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
        return pThis->ExternalAddRef();
}


ULONG FAR EXPORT  CCustomControlSite::XDocHostUIHandler::Release()
{                           
    METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
        return pThis->ExternalRelease();
}

HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler::QueryInterface(REFIID riid, void **ppvObj)
{
        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
    HRESULT hr = (HRESULT)pThis->ExternalQueryInterface(&riid, ppvObj);
        return hr;
}

// * CImpIDocHostUIHandler::GetHostInfo
// *
// * Purpose: Called at initialization
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler::GetHostInfo( DOCHOSTUIINFO* pInfo )
{

        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
        pInfo->dwFlags = DOCHOSTUIFLAG_NO3DBORDER;
    pInfo->dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT;

    return S_OK;
}

// * CImpIDocHostUIHandler::ShowUI
// *
// * Purpose: Called when MSHTML.DLL shows its UI
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler::ShowUI(
                                DWORD dwID,
                                IOleInPlaceActiveObject * /*pActiveObject*/,
                                IOleCommandTarget * pCommandTarget,
                                IOleInPlaceFrame * /*pFrame*/,
                                IOleInPlaceUIWindow * /*pDoc*/)
{

        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
        // We've already got our own UI in place so just return S_OK
    return S_OK;
}

// * CImpIDocHostUIHandler::HideUI
// *
// * Purpose: Called when MSHTML.DLL hides its UI
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler::HideUI(void)
{
        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
    return S_OK;
}

// * CImpIDocHostUIHandler::UpdateUI
// *
// * Purpose: Called when MSHTML.DLL updates its UI
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler::UpdateUI(void)
{
        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
        // MFC is pretty good about updating it's UI in it's Idle loop so I don't do anything here
        return S_OK;
}

// * CImpIDocHostUIHandler::EnableModeless
// *
// * Purpose: Called from MSHTML.DLL's IOleInPlaceActiveObject::EnableModeless
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler::EnableModeless(BOOL /*fEnable*/)
{
        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
    return E_NOTIMPL;
}

// * CImpIDocHostUIHandler::OnDocWindowActivate
// *
// * Purpose: Called from MSHTML.DLL's IOleInPlaceActiveObject::OnDocWindowActivate
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler::OnDocWindowActivate(BOOL /*fActivate*/)
{
        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
    return E_NOTIMPL;
}

// * CImpIDocHostUIHandler::OnFrameWindowActivate
// *
// * Purpose: Called from MSHTML.DLL's IOleInPlaceActiveObject::OnFrameWindowActivate
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler::OnFrameWindowActivate(BOOL /*fActivate*/)
{
        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
    return E_NOTIMPL;
}

// * CImpIDocHostUIHandler::ResizeBorder
// *
// * Purpose: Called from MSHTML.DLL's IOleInPlaceActiveObject::ResizeBorder
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler::ResizeBorder(
                                LPCRECT /*prcBorder*/,
                                IOleInPlaceUIWindow* /*pUIWindow*/,
                                BOOL /*fRameWindow*/)
{
        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
    return E_NOTIMPL;
}

// * CImpIDocHostUIHandler::ShowContextMenu
// *
// * Purpose: Called when MSHTML.DLL would normally display its context menu
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler::ShowContextMenu(
                                DWORD /*dwID*/,
                                POINT* /*pptPosition*/,
                                IUnknown* /*pCommandTarget*/,
                                IDispatch* /*pDispatchObjectHit*/)
{
        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
    return S_OK; // We've shown our own context menu. MSHTML.DLL will no longer try to show its own.
}

// * CImpIDocHostUIHandler::TranslateAccelerator
// *
// * Purpose: Called from MSHTML.DLL's TranslateAccelerator routines
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler::TranslateAccelerator(LPMSG lpMsg,
            /* [in] */ const GUID __RPC_FAR *pguidCmdGroup,
            /* [in] */ DWORD nCmdID)
{
        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
    return S_FALSE;
}

// * CImpIDocHostUIHandler::GetOptionKeyPath
// *
// * Purpose: Called by MSHTML.DLL to find where the host wishes to store
// *        its options in the registry
// *
HRESULT FAR EXPORT  CCustomControlSite::XDocHostUIHandler::GetOptionKeyPath(BSTR* pbstrKey, DWORD)
{

        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
        return E_NOTIMPL;
}

STDMETHODIMP CCustomControlSite::XDocHostUIHandler::GetDropTarget(
            /* [in] */ IDropTarget __RPC_FAR *pDropTarget,
            /* [out] */ IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget)
{
        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
    return E_NOTIMPL;
}


STDMETHODIMP CCustomControlSite::XDocHostUIHandler::GetExternal(
            /* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch)
{
        // return the IDispatch we have for extending the object Model
        IDispatch* pDisp = (IDispatch*)theApp.m_pDispOM;
        pDisp->AddRef();
        *ppDispatch = pDisp;
    return S_OK;
}
        
STDMETHODIMP CCustomControlSite::XDocHostUIHandler::TranslateUrl(
            /* [in] */ DWORD dwTranslate,
            /* [in] */ OLECHAR __RPC_FAR *pchURLIn,
            /* [out] */ OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut)
{
        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
    return E_NOTIMPL;
}
        
STDMETHODIMP CCustomControlSite::XDocHostUIHandler::FilterDataObject(
            /* [in] */ IDataObject __RPC_FAR *pDO,
            /* [out] */ IDataObject __RPC_FAR *__RPC_FAR *ppDORet)
{
        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
    return E_NOTIMPL;
}

                                               

5. 添加新头文件称为 " Idispimp.h " 并添加到下列代码: /*
* IDispimp.H
* IDispatch
*
* Copyright (c)1995-1999 Microsoft Corporation, All Rights Reserved
*/


#ifndef _IDISPIMP_H_
#define _IDISPIMP_H_

class CImpIDispatch : public IDispatch
{
    protected:
        ULONG               m_cRef;

    public:
        CImpIDispatch(void);
        ~CImpIDispatch(void);

        STDMETHODIMP QueryInterface(REFIID, void **);
        STDMETHODIMP_(ULONG) AddRef(void);
        STDMETHODIMP_(ULONG) Release(void);

                //IDispatch
        STDMETHODIMP GetTypeInfoCount(UINT* pctinfo);
        STDMETHODIMP GetTypeInfo(/* [in] */ UINT iTInfo,
            /* [in] */ LCID lcid,
            /* [out] */ ITypeInfo** ppTInfo);
                STDMETHODIMP GetIDsOfNames(
            /* [in] */ REFIID riid,
            /* [size_is][in] */ LPOLESTR *rgszNames,
            /* [in] */ UINT cNames,
            /* [in] */ LCID lcid,
            /* [size_is][out] */ DISPID *rgDispId);
                STDMETHODIMP Invoke(
            /* [in] */ DISPID dispIdMember,
            /* [in] */ REFIID riid,
            /* [in] */ LCID lcid,
            /* [in] */ WORD wFlags,
            /* [out][in] */ DISPPARAMS  *pDispParams,
            /* [out] */ VARIANT  *pVarResult,
            /* [out] */ EXCEPINFO *pExcepInfo,
            /* [out] */ UINT *puArgErr);

};
#endif //_IDISPIMP_H_
                                               

6. 添加新 CPP 文件称为 " Idispimp.cpp " 并添加到下列代码: /*
* idispimp.CPP
* IDispatch for Extending Dynamic HTML Object Model
*
* Copyright (c)1995-1999 Microsoft Corporation, All Rights Reserved
*/

#include "stdafx.h"
#include "idispimp.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


// Hardcoded information for extending the Object Model
// Typically this would be supplied through a TypeInfo
// In this case the name "xxyyzz" maps to DISPID_Extend
const        WCHAR pszExtend[10]=L"xxyyzz";
#define DISPID_Extend 12345



/*
* CImpIDispatch::CImpIDispatch
* CImpIDispatch::~CImpIDispatch
*
* Parameters (Constructor):
*  pSite           PCSite of the site we're in.
*  pUnkOuter       LPUNKNOWN to which we delegate.
*/

CImpIDispatch::CImpIDispatch( void )
{
    m_cRef = 0;
}

CImpIDispatch::~CImpIDispatch( void )
{
        ASSERT( m_cRef == 0 );
}


/*
* CImpIDispatch::QueryInterface
* CImpIDispatch::AddRef
* CImpIDispatch::Release
*
* Purpose:
*  IUnknown members for CImpIDispatch object.
*/

STDMETHODIMP CImpIDispatch::QueryInterface( REFIID riid, void **ppv )
{
    *ppv = NULL;


    if ( IID_IDispatch == riid )
        {
        *ppv = this;
        }
       
        if ( NULL != *ppv )
    {
        ((LPUNKNOWN)*ppv)->AddRef();
        return NOERROR;
    }

        return E_NOINTERFACE;
}


STDMETHODIMP_(ULONG) CImpIDispatch::AddRef(void)
{
    return ++m_cRef;
}

STDMETHODIMP_(ULONG) CImpIDispatch::Release(void)
{
    return --m_cRef;
}


//IDispatch
STDMETHODIMP CImpIDispatch::GetTypeInfoCount(UINT* /*pctinfo*/)
{
        return E_NOTIMPL;
}

STDMETHODIMP CImpIDispatch::GetTypeInfo(/* [in] */ UINT /*iTInfo*/,
            /* [in] */ LCID /*lcid*/,
            /* [out] */ ITypeInfo** /*ppTInfo*/)
{
        return E_NOTIMPL;
}

STDMETHODIMP CImpIDispatch::GetIDsOfNames(
            /* [in] */ REFIID riid,
            /* [size_is][in] */ OLECHAR** rgszNames,
            /* [in] */ UINT cNames,
            /* [in] */ LCID lcid,
            /* [size_is][out] */ DISPID* rgDispId)
{
        HRESULT hr;
        UINT        i;

        // Assume some degree of success
        hr = NOERROR;

        // Hardcoded mapping for this sample
        // A more usual procedure would be to use a TypeInfo
        for ( i=0; i < cNames; i++)
        {
                if (  2 == CompareString( lcid, NORM_IGNOREWIDTH, (char*)pszExtend, 3, (char*)rgszNames[i], 3 ) )
                {
                        rgDispId[i] = DISPID_Extend;
                }
                else
                {
                        // One or more are unknown so set the return code accordingly
                        hr = ResultFromScode(DISP_E_UNKNOWNNAME);
                        rgDispId[i] = DISPID_UNKNOWN;
                }
        }
        return hr;
}

STDMETHODIMP CImpIDispatch::Invoke(
            /* [in] */ DISPID dispIdMember,
            /* [in] */ REFIID /*riid*/,
            /* [in] */ LCID /*lcid*/,
            /* [in] */ WORD wFlags,
            /* [out][in] */ DISPPARAMS* pDispParams,
            /* [out] */ VARIANT* pVarResult,
            /* [out] */ EXCEPINFO* /*pExcepInfo*/,
            /* [out] */ UINT* puArgErr)
{

        // For this sample we only support a Property Get on DISPID_Extend
        // returning a BSTR with "Wibble" as the value
        if ( dispIdMember == DISPID_Extend )
        {
                if ( wFlags & DISPATCH_PROPERTYGET )
                {
                        if ( pVarResult != NULL )
                        {
                                WCHAR buff[10]=L"Wibble";
                                BSTR bstrRet = SysAllocString( buff );
                                VariantInit(pVarResult);
                                V_VT(pVarResult)=VT_BSTR;
                                V_BSTR(pVarResult) = bstrRet;
                        }
                }
        }

        return S_OK;
}
                                               

7. 打开 MySample.cpp 并, InitInstance 是 CMySample, 中添加下列代码。 还注释掉 AfxEnableControlContainer() 调用: BOOL CMySampleApp::InitInstance()
{
        CCustomOccManager *pMgr = new CCustomOccManager;

        // Create an IDispatch class for extending the Dynamic HTML Object Model
        m_pDispOM = new CImpIDispatch;

        // Set our control containment up but using our control container
        // management class instead of MFC's default
        AfxEnableControlContainer(pMgr);


//        AfxEnableControlContainer();
//... rest of the code here
}
                                               

8. 还将以下到 MySample.cpp 包含文件的列表: #include "afxpriv.h"
#include <..srcoccimpl.h>
#include "CustSite.h"
                                               

9. 转到 MySample.h 并在文件底部添加以下语句。 extern CMySampleApp theApp;
                                               

10. 现在转到 ClassView 选项卡, 对于 CMySampleView 写创建虚拟函数。 用代码示, 替换函数体以便函数应类似: BOOL CMySampleView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
// create the view window itself
        m_pCreateContext = pContext;
        if (!CView::Create(lpszClassName, lpszWindowName,
                                dwStyle, rect, pParentWnd,  nID, pContext))
        {
                return FALSE;
        }

        RECT rectClient;
        GetClientRect(&rectClient);

        // create the control window
        // AFX_IDW_PANE_FIRST is a safe but arbitrary ID
        if (!m_wndBrowser.CreateControl(CLSID_WebBrowser, lpszWindowName,
                                WS_VISIBLE | WS_CHILD, rectClient, this, AFX_IDW_PANE_FIRST))
        {
                DestroyWindow();
                return FALSE;
        }

        LPUNKNOWN lpUnk = m_wndBrowser.GetControlUnknown();
        HRESULT hr = lpUnk->QueryInterface(IID_IWebBrowser2, (void**) &m_pBrowserApp);
        if (!SUCCEEDED(hr))
        {
                m_pBrowserApp = NULL;
                m_wndBrowser.DestroyWindow();
                DestroyWindow();
                return FALSE;
        }

        return TRUE;
}
                                               

11. 重建并运行应用程序。 右键时您单击, 默认不会出现弹出菜单。 这是因为 CCustomControlSite::XDocHostUIHandler::ShowContextMenu 方法, 中过程只返回 S _ 一个 OK 以便 Mshtml.dll 不再尝试显示自己弹出菜单。 此时, 也可能添加自己弹出菜单来替换默认弹出菜单。  
注意 如果将来的 MFC 版本更改的 COleControlSite 或 COccManager, 实现该技术来禁用弹出菜单可能无法。 如果使用此技术来设计代码, 请通知, 您可能需要将来更改代码。
回到顶端

参考
driller (MFC) 示例
[url]http://msdn.microsoft.com/downloads/samples/Internet/browser/driller/Default.asp[/url] ([url]http://msdn.microsoft.com/downloads/samples/Internet/browser/driller/Default.asp)[/url]
回到顶端


--------------------------------------------------------------------------------

这篇文章中的信息适用于:
• Microsoft Foundation Class Library 4.2 当用于
    Microsoft Visual C++ 6.0 Professional Edition
    Microsoft Visual C++, 32-bit Learning Edition 6.0
    Microsoft Visual C++ 6.0 Enterprise Edition


回到顶端

关键字:  kbhowto kbmenu kbwebbrowser kbieobj kbdhtml KB236312 KbMtzh kbmt

回到顶端

Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值