MFC工程环境下,制作Activex ocx取消IE浏览器的安全提示

在xxxCtrl.h(xxx为项目名)头文件中的 #pragma once的 下一行 添加

//-------添加---------------
//取消ie的安全提示
#include "objsafe.h"
//---------添加完----------------------------

并在头文件类中的声明部分声明(和CxxxCtrl()构造函数同一个地方)

    //----------增加  取消ie的安全提示-----=----
    DECLARE_INTERFACE_MAP()
    BEGIN_INTERFACE_PART(ObjSafe, IObjectSafety)
    STDMETHOD_(HRESULT, GetInterfaceSafetyOptions) (
         /* [in] */ REFIID riid,
         /* [out] */ DWORD __RPC_FAR *pdwSupportedOptions,
         /* [out] */ DWORD __RPC_FAR *pdwEnabledOptions
    );
             
    STDMETHOD_(HRESULT, SetInterfaceSafetyOptions) (
         /* [in] */ REFIID riid,
         /* [in] */ DWORD dwOptionSetMask,
         /* [in] */ DWORD dwEnabledOptions
    );
    END_INTERFACE_PART(ObjSafe);
    //---------添加完----------------------------



在 CPP实现文件

BOOL Cmax200Ctrl::Cmax200CtrlFactory::UpdateRegistry(BOOL bRegister)函数后面添加如下

注意下面的代码要替换Cmax200Ctrl到你自己的类名


//--------添加-------------------
//取消ie的安全提示
/ 
// Interface map for IObjectSafety
	BEGIN_INTERFACE_MAP( Cmax200Ctrl, COleControl ) 
		INTERFACE_PART(Cmax200Ctrl, IID_IObjectSafety, ObjSafe) 
	END_INTERFACE_MAP()
/ 
// IObjectSafety member functions
// Delegate AddRef, Release, QueryInterface
ULONG FAR EXPORT Cmax200Ctrl::XObjSafe::AddRef() 
{ 
	METHOD_PROLOGUE(Cmax200Ctrl, ObjSafe) 
		return pThis->ExternalAddRef(); 
}
ULONG FAR EXPORT Cmax200Ctrl::XObjSafe::Release() 
{ 
	METHOD_PROLOGUE(Cmax200Ctrl, ObjSafe) 
		return pThis->ExternalRelease(); 
}
HRESULT FAR EXPORT Cmax200Ctrl::XObjSafe::QueryInterface( 
	REFIID iid, void FAR* FAR* ppvObj) 
{ 
	METHOD_PROLOGUE(Cmax200Ctrl, 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 
Cmax200Ctrl::XObjSafe::GetInterfaceSafetyOptions( 
	/* [in] */ REFIID riid, 
	/* [out] */ DWORD __RPC_FAR *pdwSupportedOptions, 
	/* [out] */ DWORD __RPC_FAR *pdwEnabledOptions) 
{ 
	METHOD_PROLOGUE(Cmax200Ctrl, 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 
	Cmax200Ctrl::XObjSafe::SetInterfaceSafetyOptions( 
	/* [in] */ REFIID riid, 
	/* [in] */ DWORD dwOptionSetMask, 
	/* [in] */ DWORD dwEnabledOptions) 
{ 
	METHOD_PROLOGUE(Cmax200Ctrl, 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); 
}

//-------------添加结束--------------------

/

微软官网实例 http://support.microsoft.com/kb/161873/en-us


推荐使用这个
Implement the CreateComponentCategory and RegisterCLSIDInCategory helper functions by adding the following cathelp.h and cathelp.cpp files to your project.
  1. Cathelp.h

          #include "comcat.h"
    
          // Helper function to create a component category and associated
          // description
          HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription);
    
          // Helper function to register a CLSID as belonging to a component
          // category
          HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid);
    						

    Cathelp.cpp

          #include "comcat.h"
    
          // Helper function to create a component category and associated
          // description
          HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription)
          {
             ICatRegister* pcr = NULL ;
             HRESULT hr = S_OK ;
    
             hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
                                   NULL,
                                   CLSCTX_INPROC_SERVER,
                                   IID_ICatRegister,
                                   (void**)&pcr);
             if (FAILED(hr))
                return hr;
    
             // Make sure the HKCR\Component Categories\{..catid...}
             // key is registered
             CATEGORYINFO catinfo;
             catinfo.catid = catid;
             catinfo.lcid = 0x0409 ; // english
    
             // Make sure the provided description is not too long.
             // Only copy the first 127 characters if it is
             int len = wcslen(catDescription);
             if (len>127)
                len = 127;
             wcsncpy(catinfo.szDescription, catDescription, len);
             // Make sure the description is null terminated
             catinfo.szDescription[len] = '\0';
    
             hr = pcr->RegisterCategories(1, &catinfo);
             pcr->Release();
    
             return hr;
          }
    
          // Helper function to register a CLSID as belonging to a component
          // category
          HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
          {
             // Register your component categories information.
             ICatRegister* pcr = NULL ;
             HRESULT hr = S_OK ;
             hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
                                   NULL,
                                   CLSCTX_INPROC_SERVER,
                                   IID_ICatRegister,
                                   (void**)&pcr);
             if (SUCCEEDED(hr))
             {
                // Register this category as being "implemented" by
                // the class.
                CATID rgcatid[1] ;
                rgcatid[0] = catid;
                hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);
             }
    
             if (pcr != NULL)
                pcr->Release();
    
             return hr;
          }
    						
  2. Modify the DllRegisterServer to mark the control as safe. Locate the implementation of DllRegisterServer in a .cpp file in your project. You will need to add several things to this .cpp file. Include the file that implements CreateComponentCategory and RegisterCLSIDInCategory:
          #include "CatHelp.h"
    						
    Define the GUID associated with the safety component categories:
          const CATID CATID_SafeForScripting     =
          {0x7dd95801,0x9882,0x11cf,{0x9f,0xa9,0x00,0xaa,0x00,0x6c,0x42,0xc4}};
          const CATID CATID_SafeForInitializing  =
          {0x7dd95802,0x9882,0x11cf,{0x9f,0xa9,0x00,0xaa,0x00,0x6c,0x42,0xc4}};
    						
    Define the GUID associated with your control. For simplicity, you can borrow the GUID from theIMPLEMENT_OLECREATE_EX macro in the main .cpp file for the control. Adjust the format slightly so that it looks like the following:
          const GUID CDECL BASED_CODE _ctlid =
          { 0x43bd9e45, 0x328f, 0x11d0,
                  { 0xa6, 0xb9, 0x0, 0xaa, 0x0, 0xa7, 0xf, 0xc2 } };
    						
    To mark your control as both Safe for Scripting and Initialization, modify the DllRegisterServer function as follows:
          STDAPI DllRegisterServer(void)
          {
              AFX_MANAGE_STATE(_afxModuleAddrThis);
    
              if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
                  return ResultFromScode(SELFREG_E_TYPELIB);
    
              if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
                  return ResultFromScode(SELFREG_E_CLASS);
    
              if (FAILED( CreateComponentCategory(
                      CATID_SafeForScripting,
                      L"Controls that are safely scriptable") ))
                    return ResultFromScode(SELFREG_E_CLASS);
    
              if (FAILED( CreateComponentCategory(
                      CATID_SafeForInitializing,
                      L"Controls safely initializable from persistent data") ))
                    return ResultFromScode(SELFREG_E_CLASS);
    
              if (FAILED( RegisterCLSIDInCategory(
                      _ctlid, CATID_SafeForScripting) ))
                    return ResultFromScode(SELFREG_E_CLASS);
    
              if (FAILED( RegisterCLSIDInCategory(
                      _ctlid, CATID_SafeForInitializing) ))
                    return ResultFromScode(SELFREG_E_CLASS);
    
              return NOERROR;
          }
    						
You would not normally modify the DllUnregisterServer function for these two reasons:
  • You would not want to remove a component category because other controls may be using it.
  • Although there is an UnRegisterCLSIDInCategory function defined, by default DllUnregisterServer removes the control's entry from the registry entirely. Therefore, removing the category from the control's registration is of little use.===============================================

<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"/>
<TITLE>对象 YMvideo 的 ATL 8.0 测试页</TITLE>

    <script language="javascript" type="text/javascript">
// <!CDATA[

        function Button1_onclick() {
            DpAxM.Hello("chenshicheng");
        }

        function Button2_onclick() {
            DpAxM.StartProcesser("C:\\Program Files\\ECMS\\ECMS.exe");
        }

// ]]>
    </script>
</HEAD>
<BODY>


<OBJECT ID="DpAxM" CLASSID="CLSID:F86097AA-6A58-42D8-81A3-9F55B9EA9FC6" version="1,0,0,1"></OBJECT>
<!--引入的DpAxM要加上version参数,在“允许活动内容在我的计算机上的文件中运行*”选择的情况下,不会出现其他安全提示-->

  
    <input id="Button1" type="button" value="welcome" οnclick="return Button1_onclick()" />

    <input id="Button2" type="button" value="调用程序" οnclick="return Button2_onclick()" />


</BODY>
</HTML>


、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

另外的一个参考

http://blog.csdn.net/waxgourd0/article/details/7411620

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值