如何在C++ Builder 2010中编写“安全”的Activex控件

    技术2022-06-27  59

    在默认的IE安全设置中,“对为标记为可安全执行脚本的ActiveX控件初始化并执行脚本”一项是禁用的,

    如果修改安全设置为“提示”,在浏览器端就会看到以下windows报警

    如何把ActiveX控件标记为可安全执行呢?查了下MSDN,发现只要实现IObjectSafetyImpl就行了。

    具体如下操作:1.新建ActiveX工程

     

    系统自动生成以下文件

     

    2.新增com事务对象(如果控件需要窗体界面的话,可以选择Active Form)

     

     

    生成Unit1.cpp和Unit1.h文件,存放的是myTest的申明以及具体实现

     

    3.编辑Unit1.h文件,加入IObjectSafetyImpl的实现

    // 1.1 // Unit1.h : Declaration of the TmyTestImpl #ifndef Unit1H #define Unit1H #include "Project1_TLB.H" #define _MTX_NOFORCE_LIBS #include <vcl/mtshlpr.h> / // TmyTestImpl Implements ImyTest, default interface of myTest // and ImyTestEvents, the default source interface // ThreadingModel : tmApartment // Dual Interface : TRUE // Event Support : TRUE // Default ProgID : Project1.myTest // Description : / class ATL_NO_VTABLE TmyTestImpl : public CComObjectRootEx<CComSingleThreadModel>, public CComCoClass<TmyTestImpl, &CLSID_myTest>, public IObjectControl, public IDispatchImpl<ImyTest, &IID_ImyTest, &LIBID_Project1>, //添加下面一行 public IObjectSafetyImpl<TmyTestImpl,INTERFACESAFE_FOR_UNTRUSTED_CALLER> { public: TmyTestImpl() { } // Data used when registering Object // DECLARE_THREADING_MODEL(otApartment); DECLARE_PROGID("Project1.myTest"); DECLARE_DESCRIPTION(""); // Function invoked to (un)register object // static HRESULT WINAPI UpdateRegistry(BOOL bRegister) { TTypedComServerRegistrarT<TmyTestImpl> regObj(GetObjectCLSID(), GetProgID(), GetDescription()); return regObj.UpdateRegistry(bRegister); } DECLARE_NOT_AGGREGATABLE(TmyTestImpl) BEGIN_COM_MAP(TmyTestImpl) COM_INTERFACE_ENTRY(ImyTest) COM_INTERFACE_ENTRY(IObjectControl) COM_INTERFACE_ENTRY(IDispatch) //添加下面一行 COM_INTERFACE_ENTRY(IObjectSafety) END_COM_MAP() // IObjectControl public: STDMETHOD(Activate)(); STDMETHOD_(BOOL, CanBePooled)(); STDMETHOD_(void, Deactivate)(); CComPtr<IObjectContext> m_spObjectContext; // ImyTest public: }; #endif //Unit1H

     

    4.接下来可以验证一下控件是否变“安全”了,打开Project1.ridl文件的Design界面,添加method

     

     

     

    添加参数后,点击Refresh按钮

     

    打开Unit1.cpp,找到testAlert方法,新增以下代码

    STDMETHODIMP TmyTestImpl::testAlert(BSTR msg) { ShowMessage("Hello " + (UnicodeString)msg); }

     

    5.编译Project1.dll,并执行regsvr32 path/Project1.dll,注册dll文件

    6.新建test.html文件,实验是否会出现安全提示(clsid在Project1.ridl设计界面中可以找到,myTest对应的GUID)

    <script language="JavaScript" type="text/JavaScript"> function callspeak(){ var temp = document.getElementById("stra"); x.testAlert(temp.value); } </script> <body> <input type="text" name="stra"> <input type="button" value="button" οnclick="callspeak()"> <br> <object id=x name=x classid= "clsid:22F395B1-EDA5-45AB-A66E-F1354821E987" codebase= "http://127.0.0.1/Project1.dll#version=0,0" width="0" height="0" align=center hspace=0 vspace=0/> </body>

     

    7.用浏览器打开test.html,运行效果如下,没有出现windows安全报警

     

     


    最新回复(0)