- 浏览: 151358 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
zcqshine:
学习了...正在想怎么用java解释邮件内容的
MIME编码介绍 -
zxz87:
douglas_lhs 写道
搞不懂啊,为什么要用GBK吗?
...
Struts2.0 中文乱码(我的解决方法) -
ember_319:
配置还算比较容易,看看官方文档就可以了。问题是使用起来,怎样来 ...
struts2.0.6 + tiles 使用配置过程 -
fr1202:
字段必须均为public,否则出错
动态调用 简单Java Bean 的get/set 方法 -
douglas_lhs:
搞不懂啊,为什么要用GBK吗?
UTF-8搞不定的吗?
Struts2.0 中文乱码(我的解决方法)
原文:http://blog.csdn.net/xiaoqiangXX/archive/2009/08/04/4408650.aspx
因项目需要,我们采用了ActiveX的方式开发了一个嵌入到页面的小程序,可以实现对多文件的上传。因为还不能支持断点续传所以只支持小文件的传输,但是能一次传输多个小文件对于邮件方面的应用也是很方便的。而且有进度条显示这也给了用户较好的提示。同时我们支持拖入功能,用户可以直接将文件拖入到控件中,即完成对上传文件的选取。
下面对开发中遇到的一些问题进行说明,全文基本为原创,其中参考了很多他人的经验和资料,参考处我会注明原出处。
第一个问题如何标记控件为安全
控件发布第一步如何将控件标记为安全的。如果不将控件标记为安全,浏览器将会web页面与控件交互时提示如下信息:
MSDN上对这的解释是:默认,MFC ActiveX控件不被标记为可安全编写脚本和可安全初始化。当IE运行安全级别设置为中等或高时,都回提示控件不安全。
消除提示有两种办法,The first method uses the Component Categories Manager to create the appropriate entries in the system registry.即修改控件的DllRegisterServer函数来,在注册表中标记控件为安全的。The second method implements an interface named IObjectSafety on your control.第二种方法可以详见
http://dcs.isa.ru/www/vladimirv/inetsdk/inet0002.htm。
这里就第一种方法进行说明,在MSDN上也有第一种方法的详细说明。网址:
http://support.microsoft.com/kb/161873/zh-cn
但是该方法有一些不足,这里结合Phinecos(洞庭散人)的blog
(http://www.cnblogs.com/phinecos/archive/2008/08/07/1263270.html)进行说明。
1.添加辅助函数
控件的基本结构中含有xxApp,xxCtrl,xxPropPage三个类。找到xxApp的头文件,添加三个辅助函数。
// 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);
// Helper function to unregister a CLSID as belonging to a component
// category
HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid);
找到xxApp的实现文件,添加三个辅助函数的实现。
// 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;
}
// HRESULT UnRegisterCLSIDInCategory - Remove entries from the registry
HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
{
ICatRegister *pcr = NULL ;
HRESULT hr = S_OK ;
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);
if (SUCCEEDED(hr))
{
// Unregister this category as being "implemented" by the class.
CATID rgcatid[1] ;
rgcatid[0] = catid;
hr = pcr->UnRegisterClassImplCategories(clsid, 1, rgcatid);
}
if (pcr != NULL)
pcr->Release();
return hr;
}
2.定义GUID
需要定义两个GUID用来注册控件安全性。
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}};
在控件自动注册完成后,可以在注册表的如下地方看到上面的两个GUID。
HKEY_CLASSES_ROOT\CLSID\{"your controls GUID"}\Implemented Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4} HKEY_CLASSES_ROOT\CLSID\{"your controls GUID"}\Implemented Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4} 同时需要定义要注册为安全的CLSID。
控件有四个UUID,这里我们需要将xxCtrl的UUID注册成为安全的CLSID,因为我们控件的主体功能是在这个类中实现的。
const GUID CDECL BASED_CODE _tlid =
{ 0x7DE84B6C, 0x9969, 0x4DE0, { 0xBE, 0x25, 0xC6, 0xC0, 0x63, 0x20, 0xA3, 0x70 } };
const WORD _wVerMajor = 1;
const WORD _wVerMinor = 0;
const CATID CLSID_SafeItem =
{0x4e586c5a, 0xfd41, 0x4e4c, {0xb6, 0x6d, 0x63, 0xf1, 0x10, 0xc8, 0xc4, 0xb9}};
这里的CLSID_SafeItem就是xxCtrl的UUID。
3.修改注册代码
// DllRegisterServer - 将项添加到系统注册表
STDAPI DllRegisterServer(void)
{
/*这里是原来的注册代码
OLD
AFX_MANAGE_STATE(_afxModuleAddrThis);
if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
return ResultFromScode(SELFREG_E_TYPELIB);
if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
return ResultFromScode(SELFREG_E_CLASS);
return NOERROR;*/
//NEW下面是新的注册代码
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(
CLSID_SafeItem, CATID_SafeForScripting) ))
return ResultFromScode(SELFREG_E_CLASS);
if (FAILED( RegisterCLSIDInCategory(
CLSID_SafeItem, CATID_SafeForInitializing) ))
return ResultFromScode(SELFREG_E_CLASS);
return NOERROR;
}
// DllUnregisterServer - 将项从系统注册表中移除
STDAPI DllUnregisterServer(void)
{
/*
OLD这里是原来的代码
AFX_MANAGE_STATE(_afxModuleAddrThis);
if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))
return ResultFromScode(SELFREG_E_TYPELIB);
if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))
return ResultFromScode(SELFREG_E_CLASS);
return NOERROR;*/
//NEW下面是新的代码
HRESULT hr;
AFX_MANAGE_STATE(_afxModuleAddrThis);
// Remove entries from the registry.
hr=UnRegisterCLSIDInCategory(CLSID_SafeItem,
CATID_SafeForInitializing);
if (FAILED(hr))
return hr;
hr=UnRegisterCLSIDInCategory(CLSID_SafeItem,
CATID_SafeForScripting);
if (FAILED(hr))
return hr;
if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))
return ResultFromScode(SELFREG_E_TYPELIB);
if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))
return ResultFromScode(SELFREG_E_CLASS);
return NOERROR;
}
到此完成了控件的安全标记。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xiaoqiangXX/archive/2009/08/04/4408650.aspx
发表评论
-
视频分辨率与视频相应的码率、网络要求之间的关系
2016-01-13 14:02 1165转自: http://blog.youshunedu.com ... -
SVN:多版本库环境的搭建
2013-03-25 10:48 721转载: http://blog.csdn.net/sub ... -
UML
2012-11-06 10:51 998UML中有九种建模的图标,即: http://www.u ... -
软件版本
2012-11-02 11:16 703引文来源 http://blog.csdn.net/jack ... -
网站常识
2011-05-27 15:01 799网站的一些常识: 1.工业和信息化部ICP备案(ICP备)网 ... -
对开发的程序(制作CAB)进行签名,并允许网站中使用
2010-08-22 15:26 994摘抄子: http://www.cppblog.com/fw ... -
文件加密
2010-08-19 10:22 1299如今,人们的生活与电脑已经息息相关了。我们存放在电 ... -
注册自己的协议
2010-08-16 15:32 1301from:http://phpor.net/blog/rea ... -
音频编解码格式
2009-02-27 17:56 2339音频编解码格式 *MPEG Audio Layer 1/2 * ... -
视频格式分类介绍
2009-02-24 14:13 1698目前,视频格式可以分 ... -
MTU 是什么..
2007-08-23 11:56 2262什么是MTU? MTU是Maximum Transmissio ... -
xml文件中的文档类型定义(DTD)的部分语法解释
2007-06-06 13:28 1373以下是一些在网上摘抄的(由于没有全部摘抄就没有写出出处) 1. ... -
ant svn
2007-05-25 10:42 4839原文出处:[url]http://www.wangchao.n ... -
MIME编码介绍
2007-05-10 17:12 6158以下是抄袭过来的 抄袭 ...
相关推荐
标题中的“Windows XP Windows7通过注册表将IE中对未标记为可安全执行脚本的activex控件初始化并执行脚本设置为启用”涉及到的是Windows操作系统中Internet Explorer浏览器的安全配置问题。ActiveX控件是微软在IE...
ActiveX控件可以看作是小型可执行程序,用户可以在网页中嵌入这些控件来实现特定功能,如播放视频、编辑文档等。 ### 1. ActiveX控件的组成与结构 ActiveX控件是由DLL(Dynamic Link Library)文件组成的,这些...
ActiveX控件通常以.DLL或.OCX文件形式存在,并且只能在Internet Explorer浏览器中运行,因为它是为Windows平台设计的。 ### 浏览器安全机制 为了保护用户的安全,现代浏览器实施了多种安全策略,其中最重要的是...
MFC ActiveX控件未标记为“安全脚本”和“安全初始化”。当控件在Internet Explorer中运行且安全级别设置为中或高时,这一点就变得很明显。在这些模式中的任何一种模式下,都可能会显示警告,表明控件的数据不安全,...
4. 使用ActiveX控件扩展MATLAB界面的灵活性:通过使用ActiveX控件,开发者可以为MATLAB GUI引入更多种类的交互元素,从而扩展了界面设计的可能性。 5. 调用外部ActiveX控件的方法:在MATLAB中,开发者可以通过GUIDE...
3. **安全设置**:浏览器的安全设置过高也可能阻止ActiveX控件的运行,特别是对于Internet Explorer,其默认设置可能限制了ActiveX控件的执行。 4. **系统更新**:操作系统更新或安全补丁可能会导致旧版ActiveX控件...
使用C#开发ActiveX控件(含示例教程)源码 功能介绍: ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理...
### Java调用ActiveX控件:深入解析与实践 #### 引言 在Web开发的早期阶段,跨平台兼容性是一大挑战。为了解决这一问题,开发者们探索了多种技术,其中一种便是通过Java调用ActiveX控件。本文将深入探讨如何在Java...
ActiveX 控件的安全性是非常重要的,需要确保在安装和使用过程中,遵守相关的安全协议和标准。例如,在安装 ActiveX 控件时,需要确保安装程序来自可靠的来源;在使用 ActiveX 控件时,需要确保设备的安全设置符合...
这个生成的控件承载 ActiveX 控件并将其属性、方法和事件公开为生成控件的属性、方法和事件。 如果不包装一下直接用,会出现 灾难性 错误。上面已经说明了原因。 在项目中引用生成的ax开头的dll,在窗体代码中增加:...
海康摄像机ActiveX控件是一款专为海康威视摄像机设计的OCX(OLE控件)组件,主要用于在Windows操作系统中实现对海康威视设备的远程访问和控制。ActiveX技术是微软推出的一种应用程序接口(API),它允许开发者创建可...
大华摄像头ActiveX控件是专为视频监控设备,如大华摄像头,设计的一种软件组件。ActiveX技术是由微软公司开发的一种对象链接和嵌入(OLE)技术,它允许开发者创建交互式、可定制的控件,这些控件可以在支持ActiveX的...
### 一个简单的ActiveX控件——详尽教程 在深入探讨如何开发一个简单的ActiveX控件之前,让我们先了解ActiveX控件的基本概念。ActiveX控件是一种可以在多个应用程序之间共享的软件组件,它们通常用于扩展Web浏览器...
总结来说,ActiveX控件曾是Web开发中增强功能的重要工具,但随着技术的进步和安全需求的提升,其地位已经被更安全、跨平台的技术所取代。在今天的Web开发中,我们更多地依赖于标准的HTML、CSS和JavaScript,以及相关...
它支持MFC(Microsoft Foundation Classes)库,这个库为开发Windows应用程序提供了一套丰富的类,包括对ActiveX控件的支持。开发者可以使用VC++中的MFC来简化ActiveX控件的创建过程。 在VC++中创建ActiveX控件的...
在计算机编程与系统管理领域中,ActiveX控件是一种重要的组件,它被广泛应用于Microsoft Windows操作系统中,用于提供跨应用的复用功能。ActiveX控件能够封装复杂的代码逻辑,使得不同应用程序之间可以共享功能模块...
因此,定期清理和管理ActiveX控件对于保持系统的安全和性能至关重要。 "axmgr.exe"很可能是这个清理工具的主执行文件。运行这个程序后,它会扫描系统中的所有ActiveX控件,显示详细信息,如供应商、版本号、注册...
1. **安全设置**:大多数现代浏览器默认禁用了ActiveX控件,因为它们可能带来安全风险。为了运行ActiveX控件,用户通常需要在浏览器的安全设置中调整选项,允许特定网站使用控件。 2. **操作系统更新**:随着...