• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            ++的博客

            你看不見我,你看不見我。。
            隨筆 - 22, 文章 - 0, 評論 - 2, 引用 - 0
            數據加載中……

            用ATL編寫標識為腳本安全的ActiveX控件

            一半來說,ActiveX控件在WEB開發的時候要避免使用,如果實在無法避免,則需要注意幾點:
            1. ActiveX發布后一定要代碼簽名
            2. 編寫的時候要標記為腳本安全

            下面是針對VS2005 ATL工程向導生成的工程,加入“腳本安全”的特性

            修改生成的.h文件
            #pragma?once
            #include?
            "resource.h"???????//?主符號

            #include?
            "Launch.h"
            #include?
            <vector>
            #include?
            <atlctl.h>


            //?CEduTaimentConsole

            class?ATL_NO_VTABLE?CEduTaimentConsole?:?
            ????
            public?CComObjectRootEx<CComSingleThreadModel>,
            ????
            public?CComCoClass<CEduTaimentConsole,?&CLSID_EduTaimentConsole>,
            ????
            public?IDispatchImpl<IEduTaimentConsole,?&IID_IEduTaimentConsole,?&LIBID_LaunchLib,?/*wMajor?=*/?1,?/*wMinor?=*/?0>,

            ????
            //?加入IObjectSafetyImpl,實現IObjectSafety
            ????public?IObjectSafetyImpl<CEduTaimentConsole,?INTERFACESAFE_FOR_UNTRUSTED_CALLER?|?INTERFACESAFE_FOR_UNTRUSTED_DATA>?
            {
            public:
            ????CEduTaimentConsole()
            ????
            {
            ????}


            DECLARE_REGISTRY_RESOURCEID(IDR_EDUTAIMENTCONSOLE)


            BEGIN_COM_MAP(CEduTaimentConsole)
            ????
            //?實現安全接口
            ????COM_INTERFACE_ENTRY(IObjectSafety)
            ????
            ????COM_INTERFACE_ENTRY(IEduTaimentConsole)
            ????COM_INTERFACE_ENTRY(IDispatch)
            END_COM_MAP()

            //?加入到CATID_SafeForScripting?和?CATID_SafeForInitializing?COM分組
            BEGIN_CATEGORY_MAP(CEduTaimentConsole)
            ????IMPLEMENTED_CATEGORY(CATID_SafeForScripting)
            ????IMPLEMENTED_CATEGORY(CATID_SafeForInitializing)
            END_CATEGORY_MAP()


            ????DECLARE_PROTECT_FINAL_CONSTRUCT()

            ????HRESULT?FinalConstruct()
            ????
            {
            ????????
            return?S_OK;
            ????}

            ????
            ????
            void?FinalRelease()?
            ????
            {
            ????}


            public:

            ????STDMETHOD(ShowDesktop)(VARIANT_BOOL?vbShow);
            ????STDMETHOD(EnableCtrlAltDel)(VARIANT_BOOL?vbEnabled);
            ????STDMETHOD(EnableHotKey)(VARIANT_BOOL?vbEnabled);
            ????STDMETHOD(ChangeDisplay)(VARIANT_BOOL?vbChange);

            ????
            //?加入這2個方法
            ????STDMETHOD(GetInterfaceSafetyOptions)(REFIID?riid,DWORD?*pdwSupportedOptions,DWORD?*pdwEnabledOptions);
            ????STDMETHOD(SetInterfaceSafetyOptions)(REFIID?riid,DWORD?dwOptionSetMask,DWORD?dwEnabledOptions);

            ????
            static?BOOL?IsDesktopVisible(void);

            ????
            static?BOOL?CALLBACK?__EnumWindowsProc(?HWND?hwnd,?LPARAM?lParam);
            ????
            static?void?__ShowApplications(BOOL?bShow);
            ????
            static?void?__ShowDesktop(BOOL?bShow);
            ????
            static?BOOL?__EnableHotKey(BOOL?bEnabled);
            ????
            static?void?__EnableCtrlAltDel(BOOL?bEnabled);
            }
            ;



            OBJECT_ENTRY_AUTO(__uuidof(EduTaimentConsole),?CEduTaimentConsole)

            修改.cpp文件,加入的2個方法
            STDMETHODIMP?CEduTaimentConsole::GetInterfaceSafetyOptions(REFIID?riid,
            ?????????????????????????????????????DWORD?
            *pdwSupportedOptions,
            ?????????????????????????????????????DWORD?
            *pdwEnabledOptions)
            {
            ????ATLTRACE(_T(
            "CObjectSafetyImpl::GetInterfaceSafetyOptions\n"));
            ????
            if?(!pdwSupportedOptions?||?!pdwEnabledOptions)
            ????????
            return?E_FAIL;
            ????LPUNKNOWN?pUnk;
            ????
            if?(_InternalQueryInterface?(riid,?(void**)&pUnk)?==?E_NOINTERFACE)?{
            ????????
            //?Our?object?doesn't?even?support?this?interface.
            ????????return?E_NOINTERFACE;
            ????}
            else{
            ????????
            //?Cleanup?after?ourselves.
            ????????pUnk->Release();
            ????????pUnk?
            =?NULL;
            ????}

            ????
            if?(riid?==?IID_IDispatch)?{
            ????????
            //?IDispatch?is?an?interface?used?for?scripting.?If?your
            ????????
            //?control?supports?other?IDispatch?or?Dual?interfaces,?you
            ????????
            //?may?decide?to?add?them?here?as?well.?Client?wants?to?know
            ????????
            //?if?object?is?safe?for?scripting.?Only?indicate?safe?for
            ????????
            //?scripting?when?the?interface?is?safe.
            ????????*pdwSupportedOptions?=?INTERFACESAFE_FOR_UNTRUSTED_CALLER;
            ????????
            *pdwEnabledOptions?=?m_dwCurrentSafety?&
            ????????????INTERFACESAFE_FOR_UNTRUSTED_CALLER;
            ????????
            return?S_OK;
            ????}
            else?if?((riid?==?IID_IPersistStreamInit)?||
            ????????(riid?
            ==?IID_IPersistStorage))?{
            ????????????
            //?IID_IPersistStreamInit?and?IID_IPersistStorage?are
            ????????????
            //?interfaces?used?for?Initialization.?If?your?control
            ????????????
            //?supports?other?Persistence?interfaces,?you?may?decide?to
            ????????????
            //?add?them?here?as?well.?Client?wants?to?know?if?object?is
            ????????????
            //?safe?for?initializing.?Only?indicate?safe?for?initializing
            ????????????
            //?when?the?interface?is?safe.
            ????????????*pdwSupportedOptions?=?INTERFACESAFE_FOR_UNTRUSTED_DATA;
            ????????????
            *pdwEnabledOptions?=?m_dwCurrentSafety?&
            ????????????????INTERFACESAFE_FOR_UNTRUSTED_DATA;
            ????????????
            return?S_OK;
            ????}
            else{
            ????????
            //?We?are?saying?that?no?other?interfaces?in?this?control?are
            ????????
            //?safe?for?initializing?or?scripting.
            ????????*pdwSupportedOptions?=?0;
            ????????
            *pdwEnabledOptions?=?0;
            ????????
            return?E_FAIL;
            ????}

            }


            STDMETHODIMP?CEduTaimentConsole::SetInterfaceSafetyOptions(REFIID?riid,
            ?????????????????????????????????????DWORD?dwOptionSetMask,
            ?????????????????????????????????????DWORD?dwEnabledOptions)
            {
            ????ATLTRACE(_T(
            "CObjectSafetyImpl::SetInterfaceSafetyOptions\n"));
            ????
            if?(!dwOptionSetMask?&&?!dwEnabledOptions)?return?E_FAIL;
            ????LPUNKNOWN?pUnk;
            ????
            if?(_InternalQueryInterface?(riid,?(void**)&pUnk)?==?E_NOINTERFACE)?{
            ????????
            //?Our?object?doesn't?even?support?this?interface.
            ????????return?E_NOINTERFACE;
            ????}
            else{
            ????????
            //?Cleanup?after?ourselves.
            ????????pUnk->Release();
            ????????pUnk?
            =?NULL;
            ????}

            ????
            //?Store?our?current?safety?level?to?return?in
            ????
            //?GetInterfaceSafetyOptions
            ????m_dwCurrentSafety?|=?dwEnabledOptions?&?dwOptionSetMask;
            ????
            if?((riid?==?IID_IDispatch)?&&
            ????????(m_dwCurrentSafety?
            &?INTERFACESAFE_FOR_UNTRUSTED_CALLER))?{
            ????????????
            //?Client?wants?us?to?disable?any?functionality?that?would
            ????????????
            //?make?the?control?unsafe?for?scripting.?The?same?applies?to
            ????????????
            //?any?other?IDispatch?or?Dual?interfaces?your?control?may
            ????????????
            //?support.?Because?our?control?is?safe?for?scripting?by
            ????????????
            //?default?we?just?return?S_OK.
            ????????????return?S_OK;
            ????}
            else?if?(((riid?==?IID_IPersistStreamInit)?||
            ????????(riid?
            ==?IID_IPersistStorage))?&&
            ????????(m_dwCurrentSafety?
            &?INTERFACESAFE_FOR_UNTRUSTED_DATA))?{
            ????????????
            //?Client?wants?us?to?make?the?control?safe?for?initializing
            ????????????
            //?from?persistent?data.?For?these?interfaces,?this?control
            ????????????
            //?is?safe?so?we?return?S_OK.?For?Any?interfaces?that?are?not
            ????????????
            //?safe,?we?would?return?E_FAIL.
            ????????????return?S_OK;
            ????}
            else{
            ????????
            //?This?control?doesn't?allow?Initialization?or?Scripting
            ????????
            //?from?any?other?interfaces?so?return?E_FAIL.
            ????????return?E_FAIL;
            ????}

            }


            posted on 2008-06-19 09:57 Jerry.Wang 閱讀(1637) 評論(0)  編輯 收藏 引用 所屬分類: 開發

            伊人久久大香线蕉影院95| 久久久久无码精品国产app| 四虎久久影院| 亚洲va久久久噜噜噜久久天堂| 久久人与动人物a级毛片| 国产69精品久久久久777| 久久综合九色综合久99| 一本色道久久HEZYO无码| 久久99精品国产麻豆宅宅| 理论片午午伦夜理片久久| 久久婷婷五月综合国产尤物app| 久久精品国产一区| 精品久久久无码人妻中文字幕| 狠狠干狠狠久久| 久久久久久久波多野结衣高潮| 日韩精品久久久久久| 久久久午夜精品福利内容| av午夜福利一片免费看久久| 亚洲伊人久久综合影院| 老司机国内精品久久久久| avtt天堂网久久精品| 亚洲AV伊人久久青青草原| 99久久精品国产高清一区二区| 香港aa三级久久三级老师2021国产三级精品三级在 | 亚洲精品97久久中文字幕无码| 99久久99久久久精品齐齐| 久久这里都是精品| 国产女人aaa级久久久级| 国产精品青草久久久久婷婷 | 久久久久久国产a免费观看不卡| 精品伊人久久大线蕉色首页| 四虎国产精品免费久久| 精品国产一区二区三区久久蜜臀| 精品国产乱码久久久久久郑州公司 | 精品久久久久久无码中文野结衣| 久久99精品久久久久久久久久| 久久强奷乱码老熟女| 国产成人综合久久久久久| 女人香蕉久久**毛片精品| 久久婷婷久久一区二区三区| 久久综合九色综合久99|