您的位置:首页 > 其它

编写在浏览器中不弹出警告的ActiveX控件

2014-03-17 16:23 253 查看
我们在编写ActiveX控件时,如果用在浏览器中,经常都会弹出现在运行的脚本不安全的提示, 如果给客户使用,将会带来极大不便。按照MSDN的介绍通常有两种一种是实现IObjectSafe接口,一种是通过修改注册表的方法。一般如果用ATL开发ActiveX控件,就用实现ObjectSafe接口的方法。如果用MFC开发,我觉得还是用修改注册表的方法比较方便。下面我们将第二种方法:

要包括两个文件

1.
#include "comcat.h"

2.
#include "Objsafe.h"


// 本控件的CLSID,注册表用

1.
const
GUID CDECL CLSID_SafeItem =

2.
{ 0x7AE7497B, 0xCAD8, 0x4E66, { 0xA5,0x8B,0xDD,0xE9,0xBC,0xAF,0x6B,0x61 } };


// 创建组件种类

01.
HRESULT
CreateComponentCategory(CATID catid,
WCHAR
* catDescription)

02.
{

03.
ICatRegister* pcr = NULL ;

04.
HRESULT
hr = S_OK ;

05.

06.
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,

07.
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (
void
**)&pcr);

08.
if
(FAILED(hr))

09.
return
hr;

10.

11.
// Make sure the HKCR\Component Categories\{..catid...}

12.
// key is registered.

13.
CATEGORYINFO catinfo;

14.
catinfo.catid = catid;

15.
catinfo.lcid = 0x0409 ;
// english

16.

17.
// Make sure the provided description is not too long.

18.
// Only copy the first 127 characters if it is.

19.
int
len = wcslen(catDescription);

20.
if
(len>127)

21.
len = 127;

22.
wcsncpy(catinfo.szDescription, catDescription, len);

23.
// Make sure the description is null terminated.

24.
catinfo.szDescription[len] =
''
\0
''
;

25.

26.
hr = pcr->RegisterCategories(1, &catinfo);

27.
pcr->Release();

28.

29.
return
hr;

30.
}


// 注册组件种类

01.
HRESULT
RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)

02.
{

03.
// Register your component categories information.

04.
ICatRegister* pcr = NULL ;

05.
HRESULT
hr = S_OK ;

06.
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,

07.
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (
void
**)&pcr);

08.
if
(SUCCEEDED(hr))

09.
{

10.
// Register this category as being "implemented" by the class.

11.
CATID rgcatid[1] ;

12.
rgcatid[0] = catid;

13.
hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);

14.
}

15.
if
(pcr != NULL)

16.
pcr->Release();

17.
return
hr;

18.
}


// 卸载组件种类

01.
HRESULT
UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid)

02.
{

03.
ICatRegister* pcr = NULL ;

04.
HRESULT
hr = S_OK ;

05.

06.
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,

07.
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (
void
**)&pcr);

08.
if
(SUCCEEDED(hr))

09.
{

10.
// Unregister this category as being "implemented" by the class.

11.
CATID rgcatid[1] ;

12.
rgcatid[0] = catid;

13.
hr = pcr->UnRegisterClassImplCategories(clsid, 1, rgcatid);

14.
}

15.

16.
if
(pcr != NULL)

17.
pcr->Release();

18.

19.
return
hr;

20.
}


// DllRegisterServer - Adds entries to the system registry

01.
STDAPI DllRegisterServer(
void
)

02.
{

03.
HRESULT
hr;

04.

05.
AFX_MANAGE_STATE(_afxModuleAddrThis);

06.

07.
if
(!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))

08.
return
ResultFromScode(SELFREG_E_TYPELIB);

09.

10.
if
(!COleObjectFactoryEx::UpdateRegistryAll(TRUE))

11.
return
ResultFromScode(SELFREG_E_CLASS);

12.

13.
// 标记控件初始化安全.

14.
// 创建初始化安全组件种类

15.
hr = CreateComponentCategory(CATID_SafeForInitializing, L
"Controls safely initializable from persistent data!"
);

16.
if
(FAILED(hr))

17.
return
hr;

18.
// 注册初始化安全

19.
hr = RegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForInitializing);

20.
if
(FAILED(hr))

21.
return
hr;

22.

23.
// 标记控件脚本安全

24.
// 创建脚本安全组件种类

25.
hr = CreateComponentCategory(CATID_SafeForScripting, L
"Controls safely scriptable!"
);

26.
if
(FAILED(hr))

27.
return
hr;

28.
// 注册脚本安全组件种类

29.
hr = RegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting);

30.
if
(FAILED(hr))

31.
return
hr;

32.

33.
return
NOERROR;

34.
}


// DllUnregisterServer - Removes entries from the system registry

view source

print?

01.
STDAPI DllUnregisterServer(
void
)

02.
{

03.
HRESULT
hr;

04.

05.
AFX_MANAGE_STATE(_afxModuleAddrThis);

06.

07.
if
(!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))

08.
return
ResultFromScode(SELFREG_E_TYPELIB);

09.

10.
if
(!COleObjectFactoryEx::UpdateRegistryAll(FALSE))

11.
return
ResultFromScode(SELFREG_E_CLASS);

12.

13.
// 删除控件初始化安全入口.

14.
hr=UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForInitializing);

15.
if
(FAILED(hr))

16.
return
hr;

17.
// 删除控件脚本安全入口

18.
hr=UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting);

19.
if
(FAILED(hr))

20.
return
hr;

21.

22.
//////////////////////////

23.
return
NOERROR;

24.
}


(全文完)

from:http://www.vckbase.com/index.php/wv/526
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: