ActiveX ocx控件有时在网页中无法显示需要实现IObjectSafety接口

ActiveX ocx控件有时在网页中无法显示需要实现IObjectSafety接口
通过自己调试,可能导致的原因是:
         如果没有实现IobjectSafety接口浏览器交互不安全导致的。
        
        打“开工程名Ctl.h”在最上面添加     #include <objsafe.h>
         在类中的DECLARE_DYNCREATE(C工程名Ctrl)下面添加以下代码,
        DECLARE_INTERFACE_MAP()
             BEGIN_INTERFACE_PART(ObjSafe, IObjectSafety)
              STDMETHOD_(HRESULT, GetInterfaceSafetyOption s) (
                         REFIID riid,
                         DWORD __RPC_FAR *pdwSupportedOptions,
                         DWORD __RPC_FAR *pdwEnabledOptions
              );            
                 STDMETHOD_(HRESULT, SetInterfaceSafetyOption s) (
                         REFIID riid,
                         DWORD dwOptionSetMask,
                         DWORD dwEnabledOptions
              );
           END_INTERFACE_PART(ObjSafe);

      打开“工程名Ctl.cpp”在BOOL C工程名Ctrl::C工程名CtrlFactory::UpdateRegistry(BOOL bRegister)函数上面或者下面添加如下代码    

   /////////////////////////////////////////////////////////////////////////////
  // Interface map for IObjectSafety

    BEGIN_INTERFACE_MAP( C工程名Ctrl, COleControl )
    INTERFACE_PART(C工程名Ctrl, IID_IObjectSafety, ObjSafe)    
    END_INTERFACE_MAP()    

/////////////////////////////////////////////////////////////////////////////
    // IObjectSafety member functions

    // Delegate AddRef, Release, QueryInterface

ULONG FAR EXPORT C工程名Ctrl::XObjSafe::AddRef()
{
   METHOD_PROLOGUE(C工程名Ctrl, ObjSafe)
   return pThis->ExternalAddRef();
}

ULONG FAR EXPORT C工程名Ctrl::XObjSafe::Release()
{
   METHOD_PROLOGUE(C工程名Ctrl, ObjSafe)
   return pThis->ExternalRelease();
}

HRESULT FAR EXPORT C工程名Ctrl::XObjSafe::QueryInterface(
   REFIID iid, void FAR* FAR* ppvObj)
{
   METHOD_PROLOGUE(C工程名Ctrl, ObjSafe)
   return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
}

const DWORD dwSupportedBits =
INTERFACESAFE_FOR_UNTRUSTED_CALLER |
INTERFACESAFE_FOR_UNTRUSTED_DATA;
const DWORD dwNotSupportedBits = ~ dwSupportedBits;

/////////////////////////////////////////////////////////////////////////////
// CStopLiteCtrl::XObjSafe::GetInterfaceSafetyOptions
// Allows container to query what interfaces are safe for what. We’re
// optimizing significantly by ignoring which interface the caller is
// asking for.
HRESULT STDMETHODCALLTYPE
C工程名Ctrl::XObjSafe::GetInterfaceSafetyOptions(
REFIID riid,
       DWORD __RPC_FAR *pdwSupportedOptions,
       DWORD __RPC_FAR *pdwEnabledOptions)
{
METHOD_PROLOGUE(C工程名Ctrl, ObjSafe)

 HRESULT retval = ResultFromScode(S_OK);

 // does interface exist?
IUnknown FAR* punkInterface;
retval = pThis->ExternalQueryInterface(&riid,
    (void * *)&punkInterface);
if (retval != E_NOINTERFACE) { // interface exists
punkInterface->Release(); // release it–just checking!
}

// we support both kinds of safety and have always both set,
// regardless of interface
*pdwSupportedOptions = *pdwEnabledOptions = dwSupportedBits;

 return retval; // E_NOINTERFACE if QI failed
}

/////////////////////////////////////////////////////////////////////////////
// CStopLiteCtrl::XObjSafe::SetInterfaceSafetyOptions
// Since we’re always safe, this is a no-brainer–but we do check to make
// sure the interface requested exists and that the options we’re asked to
// set exist and are set on (we don’t support unsafe mode).
HRESULT STDMETHODCALLTYPE
C工程名Ctrl::XObjSafe::SetInterfaceSafetyOptions(
       REFIID riid,
       DWORD dwOptionSetMask,
       DWORD dwEnabledOptions)
{
   METHOD_PROLOGUE(C工程名Ctrl, ObjSafe)

// does interface exist?
IUnknown FAR* punkInterface;
pThis->ExternalQueryInterface(&riid, (void * *)&punkInterface);
if (punkInterface) { // interface exists
punkInterface->Release(); // release it–just checking!
}
else { // interface doesn’t exist
return ResultFromScode(E_NOINTERFACE);
}

 // can’t set bits we don’t support
if (dwOptionSetMask & dwNotSupportedBits) {
return ResultFromScode(E_FAIL);
}

// can’t set bits we do support to zero
dwEnabledOptions &= dwSupportedBits;
// (we already know there are no extra bits in mask )
if ((dwOptionSetMask & dwEnabledOptions) !=
  dwOptionSetMask) {
return ResultFromScode(E_FAIL);
}       

// don’t need to change anything since we’re always safe
return ResultFromScode(S_OK);
}
/////////////////////////////////////////////////////////////////////////////

你可能感兴趣的:(ActiveX ocx控件有时在网页中无法显示需要实现IObjectSafety接口)