使你的ActiveX控件執行時不彈出安全性提示_第1頁
使你的ActiveX控件執行時不彈出安全性提示_第2頁
使你的ActiveX控件執行時不彈出安全性提示_第3頁
使你的ActiveX控件執行時不彈出安全性提示_第4頁
使你的ActiveX控件執行時不彈出安全性提示_第5頁
已閱讀5頁,還剩2頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、使你的ActiveX控件執行時不彈出安全性提示我們編寫一個 ActiveX 控件在 IE 中運行,一般會彈出一個安全提示,如何避免 這種情況?下面是我在參考前人的文章后,總結出“在瀏覽器中執行時不彈出 警告的 ActiveX 控件”的兩種編寫方法,予以備忘。注意, 這里不會彈出警告 是說在執行時不會彈出 ,也就是說已經安裝了這個 ActiveX 控件。 如果要下載 安裝這個 ActiveX 控件時不會彈出安全警告,恐怕就得去買數字證書了。 不過 即使有數字證書,還是得用戶同意后才會下載安裝。以下兩種方法在WINXP-SP2+VC下通過。方法 1:修改注冊表 可能你在看完下面的過程后會發現,程序

2、沒有一個地方對注冊表操作過。其實 不然,這里所謂的修改注冊表的方法就是使用組件類型管理器(ComponentCategories Manager)創建一個正確的入口到系統注冊表。IE通過檢測注冊表判 斷一個控件是否可以安全地初始化和腳本操作。 IE 會通過調用 ICatInformation:IsClassOfCategories方法確定控件是否支持給出的安全性分組。其中對注冊表的操作都已經封裝起來,隱藏在底層了,所以看不到。必須包括兩個頭文件#include <comcat.h>#include <Objsafe.h> const GUID CDECL CLSID_S

3、afeItem =0xD321B11E, 0x8E79, 0x4829, 0xAB, 0x80, 0x9E, 0x59, 0x92, 0x06, 0xAB, 0xB7;用你的控件類GUID替換/ 注冊組件種類為安全HRESULT AddCategorySafty(CATID catid, TCHAR* catDescription)ICatRegister* pcr = NULL ;HRESULT hr = S_OK ;hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_I

4、CatRegister, (void*)&pcr);if (FAILED(hr)return hr;英語語言CATEGORYINFO catinfo; catinfo.catid = catid; catinfo.lcid = 0x0409 ; / 最長只拷貝 127 個字符。 int len = lstrlen(catDescription);if (len > 127)len = 127; lstrcpyn(TCHAR*)(catinfo.szDescription), catDescription, len+1);hr = pcr->RegisterCategorie

5、s(1, &catinfo); pcr->Release();return hr;/ 移除已經注冊為安全的組件種類HRESULT RemoveCategorySafty(CATID catid)ICatRegister* pcr = NULL ;HRESULT hr = S_OK ;hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void*)&pcr);if (FAILED(hr) return hr;hr = pcr

6、->UnRegisterCategories(1, &catid); pcr->Release();return hr;/ 把你的控件注冊到已經注冊為安全的組件種類HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)ICatRegister* pcr = NULL ;HRESULT hr = S_OK ;hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (v

7、oid*)&pcr);if (SUCCEEDED(hr)CATID rgcatid1 ; rgcatid0 = catid;hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);if (pcr != NULL) pcr->Release();return hr;/ 把你的控件從安全組件種類移除HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid) ICatRegister* pcr = NULL ;HRESULT hr = S_OK ;hr =

8、CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void*)&pcr);if (SUCCEEDED(hr)/ Unregister this category as being "implemented" by the class.CATID rgcatid1 ;rgcatid0 = catid;hr = pcr->UnRegisterClassImplCategories(clsid, 1, rgcatid);if

9、 (pcr != NULL)pcr->Release();return hr;/ 使你的控件不彈出警告地執行HRESULT MakeActiveXSafty(REFCLSID clsid)HRESULT hr;hr = AddCategorySafty(CATID_SafeForInitializing, _T("Controls safely initializable!");if (FAILED(hr) return hr;hr = RegisterCLSIDInCategory(clsid,CATID_SafeForInitializing);if (FAILE

10、D(hr) return hr;hr = AddCategorySafty(CATID_SafeForScripting, _T("Controls safely scriptable!");if (FAILED(hr) return hr;hr = RegisterCLSIDInCategory(clsid, CATID_SafeForScripting);return hr; / 去除控件的安全執行性HRESULT UnMakeActiveXSafty(REFCLSID clsid)HRESULT hr;hr = UnRegisterCLSIDInCategory(cl

11、sid, CATID_SafeForInitializing);if (FAILED(hr)return hr;hr = UnRegisterCLSIDInCategory(clsid, CATID_SafeForScripting);if (FAILED(hr)return hr;/ 下面的代碼是把安全組件種類去掉。去掉的話,如果有其他的控件注冊為這 兩個種類/ 那么其他的控件執行時就會彈出警告。需不需要下面的代碼就見仁見智,看 實際情況了hr = RemoveCategorySafty(CATID_SafeForInitializing);if (FAILED(hr)return hr;h

12、r = RemoveCategorySafty(CATID_SafeForScripting);return hr;然后在DIIRegisterServer函數的“ return NOERROR”前添加如下代碼:HRESULT hr = MakeActiveXSafty(CLSID_SafeItem);if (FAILED(hr)return hr;在 DIIUnregisterServer 函數的“ AFX_MANAGE_STATE(_afxModuIeAddrThis”); 后添加如下代碼:HRESULT hr = UnMakeActiveXSafty(CLSID_SafeItem);if

13、 (FAILED(hr)OutputDebugString(_T(" 去除控件的安全執行性時出錯 !");方法 2:實現 ObjectSafe 接口 我創建了一個 MFCActiveX ControlWizard 的工程, 工程為 TestAX ,它的控件類是 CTestAXCtrl , 下面所有的代碼和操作都是在這個類的頭文件和實現文件中進行。紅色的部分是為了實現ObjectSafe 接口而增加的代碼。在頭文件中:#if !defined(AFX_TESTAXCTL_H_C2084528_F93E_42D8_A13D_7E38775A0481_INCLUDED_)#def

14、ine AFX_TESTAXCTL_H_C2084528_F93E_42D8_A13D_7E38775A0481_INCLUDED_#if _MSC_VER > 1000#pragma once#endif / _MSC_VER > 1000/ #include <ComCat.h>#include <ObjSafe.h>/ 增加這個頭文件/ TestAXCtl.h : Declaration of the CTestAXCtrl ActiveX Control class./ CTestAXCtrl : See TestAXCtl.cpp for impl

15、ementation.class CTestAXCtrl : public COleControlDECLARE_DYNCREATE(CTestAXCtrl)/ Constructorpublic:CTestAXCtrl();/ 增加如下代碼 :DECLARE_INTERFACE_MAP()BEGIN_INTERFACE_PART(MyObjSafe, IObjectSafety)STDMETHOD_(HRESULT, GetInterfaceSafetyOptions) (REFIID riid,DWORD _RPC_FAR *pdwSupportedOptions,DWORD _RPC_F

16、AR *pdwEnabledOptions);STDMETHOD_(HRESULT, SetInterfaceSafetyOptions) (REFIID riid,DWORD dwOptionSetMask,DWORD dwEnabledOptions);END_INTERFACE_PART(MyObjSafe);在實現文件中:/ TestAXCtl.cpp : Implementation of the CTestAXCtrl ActiveX Control class.#include "stdafx.h"#include "testAX.h"#i

17、nclude "TestAXCtl.h"#include "TestAXPpg.h" #ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE #endifIMPLEMENT_DYNCREATE(CTestAXCtrl, COleControl)/ 接口映射BEGIN_INTERFACE_MAP(CTestAXCtrl, COleControl ) INTERFACE_PART(CTestAXCtrl, IID_IObjectSafety, MyObjS

18、afe) END_INTERFACE_MAP()。(其他代碼省略)/ 接口的函數實現ULONG FAR EXPORT CTestAXCtrl:XMyObjSafe:AddRef()METHOD_PROLOGUE(CTestAXCtrl, MyObjSafe) return pThis->ExternalAddRef();ULONG FAR EXPORT CTestAXCtrl:XMyObjSafe:Release()METHOD_PROLOGUE(CTestAXCtrl, MyObjSafe) return pThis->ExternalRelease();iid,HRESULTF

19、AREXPORTCTestAXCtrl:XMyObjSafe:QueryInterface(REFIID void FAR* FAR* ppvObj)METHOD_PROLOGUE(CTestAXCtrl, MyObjSafe) return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj); / 調用方法與數據是否可信任,設置這兩個標志位就可以了const DWORD g_dwSupportedBits = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;const DWORD g_dwNotSuppo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論