闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧湱鈧懓瀚崳纾嬨亹閹烘垹鍊為悷婊冪箻瀵娊鏁冮崒娑氬幈濡炪値鍘介崹鍨濠靛鐓曟繛鍡楃箳缁犳娊鏌嶈閸撴瑧绮诲澶婄?闂侇剙鍗曢崶顒夋晬婵犲﹤鎳愰悞濂告煟鎼搭垳绉甸柛瀣╃劍缁傚秴饪伴崼鐔哄幐闂佸憡鍔戦崝宀勫焵椤掑倹鏆鐐茬箻閸╁嫰宕樿缁犳艾顪冮妶鍡楀闁稿﹥娲熷鎼佸箣濠€垹閰e畷鎯邦檪闂婎剦鍓熼弻鐔碱敊閻e本鍣板銈冨灪濡啫鐣烽悢鐓幬╅柕澶堝€曢ˉ姘舵煟閻斿摜鐭婄紒缁樺浮瀹曟岸骞掗幘鍓佺槇濠殿喗锕╅崜娑㈩敇濞差亝鈷戦柟绋垮閻撱儵鏌涘Ο鑽ょ煉鐎规洘鍨块獮妯肩磼濡粯鐝栭梻渚€鈧偛鑻晶鎾煙椤曗偓缁犳牠寮幘缁樺亹闁肩⒈鍓﹂崥瀣繆閻愵亜鈧牕螞娴h鍙忛柕鍫濐樈閺佸﹪鏌¢崶銉ョ仾闁抽攱甯掗湁闁挎繂鎳忛幉鍝ョ磼婢跺苯鍔嬪ǎ鍥э躬椤㈡洟濮€閳ュ厖娣梻浣筋嚃閸犳岸宕戦妶澶婃瀬闁告劦鍠栫壕鍏兼叏濡潡鍝洪柣鎿勭秮濮婄粯鎷呴崫銉ㄥ┑鈽嗗亜濞硷繝骞冮悙鐑樻櫇闁稿本绋戞禍妤呮⒑闂堟侗妲撮柡鍛矒閹繝鎮㈤崗鑲╁幐闂佹悶鍎弲娑欑濠婂牊鐓冪憸婊堝礈濞嗗骏鑰块梺顒€绉撮悞鍨亜閹哄秷鍏岄柛鐔哥叀閺岀喖宕欓妶鍡楊伓     濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴f閺嬩線鏌涘☉姗堟敾闁告瑥绻橀弻锝夊閻樺樊妫岄梺杞扮閿曨亪寮婚垾鎰佸悑閹肩补鈧磭顔愰梻鍌氬€搁崑鍡涘垂闁秴桅闁告洦鍨伴崘鈧梺闈浤涢崨顖氬笌缂傚倸鍊峰ù鍥╃礄娴兼潙纾规繝闈涱儏閽冪喖鏌ㄥ┑鍡╂Ч闁哄懏鐓¢弻娑樷槈閸楃偞鐏嶉梺鍦厴娴滃爼骞冨Δ鍐╁枂闁告洦鍓涢ˇ銊╂⒑缂佹ɑ鎯堢紒缁樼箓椤曪絾绻濆顓炰簻闁荤偞绋堥埀顒€鍘栨竟鏇炩攽閻愭潙鐏︽い蹇庡嵆楠炲鏁冮埀顒傚閸ф鐓涢柛銉㈡櫅閺嬫梻绱掗悩鑽ょ暫闁哄瞼鍠撻埀顒佺⊕宀e潡骞婇崘顔界厽闊洤锕ュ▍濠囨煛瀹€瀣М妤犵偞岣块埀顒勬涧閹诧繝宕氬☉銏♀拺闁告繂瀚﹢浼存煟閳哄﹤鐏﹂柣娑卞櫍瀹曞爼顢楅埀顒傜矆閸岀偞鐓曟繝闈涘閸旀粓鏌¢崨顓滃仮婵﹦绮幏鍛存惞閻熸壆顐奸梻浣烘嚀閹诧繝骞冮崒鐐偓渚€寮介妸銉х獮婵犵數濮寸€涒晝绱炴惔鈾€鏀介柣鎰级閳绘洖霉濠婂嫮鐭掓鐐村灴閹虫粓鎮欓柅娑氱泿闂備浇顫夊畷妯衡枖濞戞瑧顩锋繝濠傚暊閺€浠嬫煃閳轰礁鏆為柕鍥ㄧ箖閹便劍绻濋崨顕呬哗闂佺懓寮堕幐鍐茬暦閻旂⒈鏁囬柣鏃偳归弲鎼佹⒑鐠囧弶鍞夋い顐㈩槸鐓ら柣鏂捐荡缂傛氨鎲搁弮鍫涒偓浣割潩鐠轰綍銊╂煥閺傚灝鈷旈柣锕€鐗撳娲箹閻愭彃濮岄梺鍛婃煥缁夋挳鍩㈠澶婎潊闁靛牆妫岄幏娲煟閻樺厖鑸柛鏂胯嫰閳诲秹骞囬悧鍫㈠幍闂佸憡鍨崐鏍偓姘炬嫹

45fan.com - 路饭网

搜索: 您的位置主页 > 电脑频道 > 电脑教程 > 阅读资讯:ActiveX控件的WEB发布的详细介绍

ActiveX控件的WEB发布的详细介绍

2016-09-07 10:59:03 来源:www.45fan.com 【

ActiveX控件的WEB发布的详细介绍

ActiveX控件的WEB发布

ActiveX控件的WEB发布有两部分组成

1. ActiveX控件的制作部分要求

WEB发布对ActiveX控件的编码生成部分的要求就是必须实现ActiveX控件的安全接口“IObjectSafety 接口”:

 

2. ActiveX控件的发布要求

1)制作ActiveX空间的CAB包 :

创建 CAB 文件请参见

为 MFC 和 ATL 控件创建签名 CAB 文件本节内容描述如何创建在 Internet 上分发 ATL 和 MFC 控件的 CAB 文件。如果需要有关 CAB 文件的更多信息,请参见 Platform SDK 文档中的压缩文件参考一文(在 MSDN Library/Setup 和 System Administration/Setup/Setup API/Overview/Cabinet Files 目录下)。

创建 CAB 文件:

创建 INF 文件。

运行 CABARC 实用工具。

创建 INF 文件

INF 文件是一个文本文件,用以指定为控件的运行而需要显示或下载的文件(如 DLL 文件或其他 OCX 文件)。INF 文件使您得以将所有所需的文件捆绑在一个压缩的 CAB 文件中。默认情况下,版本号同用户硬盘上的现有文件相同的文件不下载。有关 INF 文件及其选项的更多信息,包括如何创建与平台无关的 INF 文件,请参见 Platform SDK 文档中的关于 INF 文件和使用 INF 文件(在 MSDN Library/Setup 和 System Administration/Setup/Setup API/Overview/Setup Applications 目录下)。

举例来说,下面的 INF 文件用于为 ATL Polygon 控件创建 CAB 文件。可通过从 Visual C++ CD 下载 ATL POLYGON 示例文件和生成 MinSize 版本来生成 POLYGON.DLL。如果生成了 Polygon 控件的 MinSize 版,还需要另外一个 DLL,即 ATL.DLL。由于需要在 POLYGON.DLL 之前注册 ATL.DLL,因此请将 ATL.DLL 放置在 INF 文件中的第一位:

; Sample INF file for POLYGON.DLL

[version]

; version signature (same for both NT and Win95) do not remove

signature="$CHICAGO$"

AdvancedINF=2.0

[Add.Code]

polygon.dll=polygon.dll

atl.dll=atl.dll

; needed DLL

[atl.dll]

file-win32-x86=thiscab

FileVersion=2,00,0,7024

DestDir=11

RegisterServer=yes

[polygon.dll]

file-win32-x86=thiscab

clsid={4CBBC676-507F-11D0-B98B-000000000000}

FileVersion=1,0,0,1

RegisterServer=yes

; end of INF file

此 INF 文件指定需要在系统上安装给定版本的 ATL.DLL。如果 ATL.DLL 尚未存在于系统中,它将从用此 INF 创建的 CAB 文件中下载。“thiscab”是一个关键字,表示 CAB 包含此 INF。也可通过指定一条绝对或相对路径,从一个 HTTP 位置下载所需的 DLL,例如:

file-win32-x86=http://example.microsoft.com/mydir/NEEDED.DLL

关键字“file-win32-x86”将平台标识为 x86 特定的。

可通过在 Windows 资源管理器中的文件上单击鼠标右键来获取文件的版本号。从显示的列表中选择“属性”,然后在显示的对话框中选择“版本”选项卡。有时需要在文件版本中额外插入一个 0。例如,在对话框中 ATL.DLL 的版本号显示为 2.00.7024。而在 INF 文件中,这变为 2, 00, 0, 7024。

“DestDir”是将要加载文件的目录所在的位置:11 指定系统目录为 WINDOWS/SYSTEM 或 WINNT/SYSTEM32;10 指定 Windows 目录、WINDOWS 或 WINNT。如果未指定任何 DestDir(典型情况),则代码安装在固定的 OCCACHE 目录中。

“clsid”是将要安装的控件的 CLSID。

创建了 INF 文件后,运行 CABARC 实用工具(可在 Mssdk/Bin 目录中找到)以创建 CAB 文件。应在包含源文件的目录下运行 CABARC。在命令行上,按源文件出现在 INF 中的顺序排列它们,并将 INF 文件放在最后。例如,若要从上面的 INF 文件生成 Polygon 控件的 CAB 文件,请使用下面的命令:

C:/MSSDK/BIN/CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF

POLYGON.CAB 文件包含一个 ATL.DLL 和 POLYGON.DLL 的压缩版本,同时还含有在 POLYGON.INF 文件中将其解压缩所需的信息。

有关如何分析及从 CAB 文件中解压缩组件的示例,请参见 http://msdn.microsoft.com/visualc/downloads/samples.asp(选择 CabView 链接)上 MSDN Online Code Center 中的 CabView 示例。

需要在 MFC 控件中包含的 DLL 文件有 MSVCRT.DLL、MFC42.DLL 和 OLEPRO32.DLL。

运行 CABARC 实用工具

可在 Mssdk/Bin 目录中找到 CABARC 实用工具。例如:

C:/MSSDK/BIN/CABARC -s 6144 n MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF

CABARC 创建一个称为 MYCTL.CAB 的 CAB 文件。

应在包含源文件(INF、OCX 和 DLL 文件)的目录下运行 CABARC。将在 CAB 文件中存档的文件应该按它们在 INF 文件中列出的同一顺序在命令行中列出。在上面的示例中,INF 文件应该将 NEEDED1.DLL 列在第一位,接下来是 NEEDED2.DLL,然后是 MYCTL.OCX。

-s 选项在压缩文件中保留用于代码签名的空间。n 命令指定希望创建 CAB 文件。有关 CABARC 命令和选项的列表,请在命令行上仅键入 CABARC:

C:/MSSDK/BIN/CABARC

浅析ActiveX控件的CAB压缩

任凤华

摘 要 本文简单介绍了CAB压缩,以及使用WinCAB将ActiveX控件压缩为CAB文件的具体步骤。

关键词 ActiveX控件;CAB压缩;WinCAB;INF文件

1. 引言

ActiveX控件技术是从OLE基础上发展起来的,是将OLE进行了扩展从而使其适应Internet、Intranet、商业应用程序等的开发。当ActiveX控件的程序代码在Internet上传输时,使用压缩技术传输程序代码变得非常有意义。

从另一方面来看,如果ActiveX控件还调用到其他的DLL程序模块,那么IE也必须把这些程序下载到本地来。为此,Microsoft采用了惯用的CAB压缩方法,它把ActiveX控件应用程序以及相关的其他文件放在同一个CAB文件中,然后在CODEBASE属性中指定CAB文件的URL路径。当IE找到CODEBASE属性时,它会自动解析URL地址从而把CAB文件解压到客户机的临时目录,然后注册有关文件,调用COM API函数创建ActiveX控件对象。这样就完成了ActiveX控件的传输。

2. CAB压缩技术简介

微软公司在发行Windows 95、Plus!95等软件时采用了一种全新的CAB压缩包形式,它具有压缩率高、安全性好、不易受到破坏等优点,深受广大用户及软件制作商的欢迎。许多用户甚至因此希望将自己的数据文件改用CAB压缩包的形式加以压缩、备份,以尽可能的减少备份文件所占用的磁盘空间,并提高它们的安全性。目前制作CAB文件的软件有主要有Cabarc和WinCAB。

Cabarc是一个用于压缩、列出压缩包中的文件、解压CAB文件的工具。Cabarc支持通配符和递归路径搜索。不过Cabarc使用一个类似于常用的压缩工具的命令行界面,

并且有较多的参数,与现在主流的Windows操作系统不太协调,使用起来不是很方便。

而WinCAB是一种可视化的全新的CAB压缩包制作软件,它具有采用图形界面、支持分卷压缩、可制作具有自解包功能的CAB压缩包(*.EXE文件格式)等优秀功能,这就从根本上解决了CAB压缩包的制作问题。需要注意的是在运行WinCAB.exe时,必须确保makecab.exe文件也在相同的目录下。

本文就以WinCAB为例来介绍ActiveX控件的CAB文件的制作过程。

3. 将ActiveX控件压缩成CAB文件

主要步骤有:

1)注册YourCtl.ocx控件。

2)建立YourCtl.inf文件。

INF文件的格式如下:(在使用Visual C++6.0的情况下)

[version]

signature="$CHICAGO$"

AdvancedINF=2.0

[Add.Code]

YourCtl.ocx=YourCtl.ocx

mfc42.dll=mfc42.dll

msvcrt.dll=msvcrt.dll

olepro32.dll=olepro32.dll

[YourCtl.ocx]

file-win32-x86=thiscab

clsid={YourCtl.ocx的CLSID} //在YourCtl.odl文件中可以找到

FileVersion=1,0,0,1

RegisterServer=yes

[msvcrt.dll]

FileVersion=6,0,8168,0

hook=mfc42installer

[mfc42.dll]

FileVersion=6,0,8168,0

hook=mfc42installer

[olepro32.dll]

FileVersion=5,0,4261,0

hook=mfc42installer

[mfc42installer]

file-win32-x86=VALUE=http://activex.microsoft.com/controls/vc/mfc42.cab

run= % EXTRACT_DIR % /mfc42.exe

这里需要说明的是上述msvcrt.dll、mfc42.dll、olepro32.dll的FileVersion是根据VC不同的版本而异的,例如在VC5.0sp3中就应该如下

olepro32.dll 5,0,4230,1

mfc42.dll 4,21,0,7303

msvcrt.dll 5,0,0,7303

每个VC版本都有不同的版本号,这里只介绍常见的两种。 另外mfc42installer的下载路径除了VC4.1和更早版本使用http://activex.microsoft.com/controls/vc/mfc40.cab外,其他版本都使用http://activex.microsoft.com/controls/vc/mfc42.cab。

3)启动WinCAB开始压缩。(其中注意Makecab.exe要在WinCAB目录下)

i)启动WinCAB,然后执行“Cabinet”菜单的“New”命令或单击快捷工具栏上的“New cabinet”按钮,准备制作新的CAB压缩包。

ii)单击快捷工具栏上的“Add file(s) to cabinet”按钮,打开“Add file(s) to cabinet”对话框。

iii)选择欲添加到CAB压缩包中的文件后单击“打开”按钮,将它们添加到WinCAB的文件列表中。这里只需要添加YourCtl.ocx和YourCtl.inf两个文件。

iv)在WinCAB快捷工具栏的“Cabinet path and name”框中输入或利用“Browse for path and name”按钮指定CAB压缩包的路径及文件名。

v)在“Cabinet size”栏中指定CAB压缩包的尺寸。

vi)在“Compression method”框中选择合适的压缩方式。

vii)单击“Save cabinet”按钮,WinCAB即会按照用户的要求进行压缩。

viii)压缩完成后,WinCAB会给出一个“WinCAB Report”的报告框,向广大用户报告有关文件个数、压缩前后的文件尺寸、压缩率、压缩时间等情况。至此,一个CAB文件就生成了。

4. 结束语

由于CAB的压缩率比我们常用的ARJ、ZIP、RAR等压缩包要高许多(约20%),从而进一步的减少了压缩文件所占用的磁盘空间,当采用该技术在Internet上传输ActiveX控件时既减少了网络流量,也加快了网页打开的速度。

另外,由于CAB压缩包具有“只读”属性,在创建完成后即不允许再作任何修改、删除,因此不易受到病毒、误操作等问题的影响,安全性也具有保证,实为广大用户在Windows 下进行文件的压缩、备份工作时的最佳选择。

注:**基金项目**,国家973计划,(编号:G1998030600)。

关于证书和签名 -|zuiwanting 发表于 2006-5-24 9:58:00

/Program Files/Microsoft Visual Studio .NET 2003/SDK/v1.1/Bin下有关于证书和签名相关工具

1。Makecert.exe ---证书创建工具

2。Cert2Spc.exe ---发行者证书测试工具

3。Signcode.exe ---文件签名工具

建立自己的根证书:

makecert -sk myPK -ss myName -n "CN=LUO31工作室" -r c:/luo31.cer

sk-表示主题的密钥容器位置,ss-主题的证书存储名称, n-证书颁发对象,r-证书存储位置;

如果你需要导出私钥文件,请不要使用sk,而换作s,eg:makecert -ss myName -n "CN=LUO31工作室" -sv c:/luo31.pvk -r c:/luo31.cer

建立自根证书授权的子证书:

makecert -sk "myPK" -is myName -n "CN=luo31" -$ commercial -ic c:/luo31.cer c:/31.cer

sk-表示主题的密钥容器位置,is-颁发者的证书存储名称, n-证书颁发对象,ic-颁发者的证书存储位置,-$-授权范围(用于代码签名);

使用Cert2Spc生成spc发行者证书(可选):

cert2spc c:/31.cer c:/31.spc

使用signcode为你的程序,库或cab包签名:

双击signcode,或在控制台键入signcode,不带参数会启动签名向导。在第三步选择“自定义选项”,第四步选择“从文件选择”选择31.spc或31.cer,第五步选择“CSP中的私钥”,在密钥容器中选择我们定义的myPK,其他步骤默认即可,如果想添加时间戳,请在时间戳服务器地址上键入:(免费时间戳认证)http://timestamp.verisign.com/scripts/timstamp.dll ;

完成后,观察你所签名的文件属性,应该已经添加数字签名项

3. ActiveX控件在页面上的引用

<OBJECT id="axGraphOcxSCADA" style="Z-INDEX: 102; LEFT: 160px; WIDTH: 784px; POSITION: absolute; TOP: 80px; HEIGHT: 536px"

codeBase="GraphOcx.CAB#version=1,0,0,3" classid="clsid:87186EA1-4D89-4F3E-9D25-1F03F0DDDB95"

name="axGraphOcxSCADA" VIEWASTEXT>

<PARAM NAME="_Version" VALUE="65536">

<PARAM NAME="_ExtentX" VALUE="20743">

<PARAM NAME="_ExtentY" VALUE="14182">

<PARAM NAME="_StockProps" VALUE="0">

</OBJECT>

如何作为安全标记 MFCActiveX 控件对于脚本和初始化

察看本文应用于的产品

注意:这篇文章是由无人工介入的自动的机器翻译系统翻译完成。这些文章是微软为不懂英语的用户提供的, 以使他们能够理解这些文章的内容。微软不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的使用所引起的任何直接的, 或间接的可能的问题负责。

文章编号 : 161873

最后修改 : 2005年9月1日

修订 : 3.0

概要

默认情况下, MFCActiveX 控件不标记为对于脚本安全和对初始化安全。 这将成为明显当控件运行 InternetExplorer 中与安全级别设置为中型或高。 是这些模式, 以警告可能显示控件的数据是不安全或, 控件不是对于要使用脚本安全。

可以使用两种方法, 控件可用于消除这些错误。 第涉及到控件实现 IObjectSafety 接口, 是用于控件, 要更改其行为并成为如果一个 Internet 浏览器的上下文中运行 " 安全 "。 第二涉及修改控件的 DllRegisterServer 函数以注册表中 " 安全 " 标记该控件。 本文介绍秒的这些方法。 首方法, 实现 IObjectSafety 接口, 将讲述 InternetClientSDK 中。

请记住, 控件应只标记是否实际上, 安全, 安全。 请到 InternetClientSDK 文档有关的此说明。 请组件开发 Section 下参阅 " 安全初始化和脚本对 ActiveX 控件 "。

注意 本文不涉及如何对下载安全标记控件。 有关代码下载和代码签名, 上详细信息请参阅 InternetClientSDK 到。

回到顶端

更多信息

请按照下列步骤来 MFC ActiveX 控件标记为对于脚本安全和对初始化安全: 1. 通过向项目添加下列 cathelp.h 和 cathelp.cpp 文件实现 CreateComponentCategory 和 RegisterCLSIDInCategory Helper 函数。

回到顶端

Cathelp.h

#include "comcat.h"

// 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);

回到顶端

Cathelp.cpp

#include "comcat.h"

// 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;

}

2. 修改 DllRegisterServer 来标记作为安全控件。 在项目中一个 .cpp 文件中找到 DllRegisterServer 的实现。 需要在此 .cpp 文件添加一些操作。 包括实现 CreateComponentCategory 和 RegisterCLSIDInCategory 文件:

#include "CatHelp.h"

定义 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。 为简单起见, 您可借用 GUID 从 IMPLEMENT_OLECREATE_EX 宏对控件主 .cpp 文件中。 略微调整格式: 它类似下面这样(注意这里定义的就是将来ActiveX控件发布时生成的classid 如:classid="clsid:87186EA1-4D89-4F3E-9D25-1F03F0DDDB95"

const GUID CDECL BASED_CODE _ctlid =

{ 0x43bd9e45, 0x328f, 0x11d0,

{ 0xa6, 0xb9, 0x0, 0xaa, 0x0, 0xa7, 0xf, 0xc2 } };

要将控件标记为脚本和初始化, 作为两个安全如下修改 DllRegisterServer 函数:

STDAPI DllRegisterServer(void)

{

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(

_ctlid, CATID_SafeForScripting) ))

return ResultFromScode(SELFREG_E_CLASS);

if (FAILED( RegisterCLSIDInCategory(

_ctlid, CATID_SafeForInitializing) ))

return ResultFromScode(SELFREG_E_CLASS);

return NOERROR;

}

您将通常不修改 DllUnregisterServer 函数: 因此两 • 您不希望删除组件类别, 因为它可能使用其他控件。

• DllUnregisterServer 虽然有是 UnRegisterCLSIDInCategory 函数定义, 默认从注册表删除控件的项完全。 因此, 从控件注册删除类别是很少使用。

应编译和注册控件, 后, 在注册表中找到以下项:

HKEY_CLASSES_ROOT/Component

Categories/{7DD95801-9882-11CF-9FA9-00AA006C42C4}

HKEY_CLASSES_ROOT/Component

Categories/{7DD95802-9882-11CF-9FA9-00AA006C42C4}

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}ActiveX控件的WEB发布有两部分组成

1. ActiveX控件的制作部分要求

WEB发布对ActiveX控件的编码生成部分的要求就是必须实现ActiveX控件的安全接口“IObjectSafety 接口”:

 

如何作为安全标记 MFCActiveX 控件对于脚本和初始化

察看本文应用于的产品

注意:这篇文章是由无人工介入的自动的机器翻译系统翻译完成。这些文章是微软为不懂英语的用户提供的, 以使他们能够理解这些文章的内容。微软不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的使用所引起的任何直接的, 或间接的可能的问题负责。

文章编号 : 161873

最后修改 : 2005年9月1日

修订 : 3.0

概要

默认情况下, MFCActiveX 控件不标记为对于脚本安全和对初始化安全。 这将成为明显当控件运行 InternetExplorer 中与安全级别设置为中型或高。 是这些模式, 以警告可能显示控件的数据是不安全或, 控件不是对于要使用脚本安全。

可以使用两种方法, 控件可用于消除这些错误。 第涉及到控件实现 IObjectSafety 接口, 是用于控件, 要更改其行为并成为如果一个 Internet 浏览器的上下文中运行 " 安全 "。 第二涉及修改控件的 DllRegisterServer 函数以注册表中 " 安全 " 标记该控件。 本文介绍秒的这些方法。 首方法, 实现 IObjectSafety 接口, 将讲述 InternetClientSDK 中。

请记住, 控件应只标记是否实际上, 安全, 安全。 请到 InternetClientSDK 文档有关的此说明。 请组件开发 Section 下参阅 " 安全初始化和脚本对 ActiveX 控件 "。

注意 本文不涉及如何对下载安全标记控件。 有关代码下载和代码签名, 上详细信息请参阅 InternetClientSDK 到。

回到顶端

更多信息

请按照下列步骤来 MFC ActiveX 控件标记为对于脚本安全和对初始化安全: 1. 通过向项目添加下列 cathelp.h 和 cathelp.cpp 文件实现 CreateComponentCategory 和 RegisterCLSIDInCategory Helper 函数。

回到顶端

Cathelp.h

#include "comcat.h"

// 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);

回到顶端

Cathelp.cpp

#include "comcat.h"

// 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;

}

2. 修改 DllRegisterServer 来标记作为安全控件。 在项目中一个 .cpp 文件中找到 DllRegisterServer 的实现。 需要在此 .cpp 文件添加一些操作。 包括实现 CreateComponentCategory 和 RegisterCLSIDInCategory 文件:

#include "CatHelp.h"

定义 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。 为简单起见, 您可借用 GUID 从 IMPLEMENT_OLECREATE_EX 宏对控件主 .cpp 文件中。 略微调整格式: 它类似下面这样(注意这里定义的就是将来ActiveX控件发布时生成的classid 如:classid="clsid:87186EA1-4D89-4F3E-9D25-1F03F0DDDB95"

const GUID CDECL BASED_CODE _ctlid =

{ 0x43bd9e45, 0x328f, 0x11d0,

{ 0xa6, 0xb9, 0x0, 0xaa, 0x0, 0xa7, 0xf, 0xc2 } };

要将控件标记为脚本和初始化, 作为两个安全如下修改 DllRegisterServer 函数:

STDAPI DllRegisterServer(void)

{

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(

_ctlid, CATID_SafeForScripting) ))

return ResultFromScode(SELFREG_E_CLASS);

if (FAILED( RegisterCLSIDInCategory(

_ctlid, CATID_SafeForInitializing) ))

return ResultFromScode(SELFREG_E_CLASS);

return NOERROR;

}

您将通常不修改 DllUnregisterServer 函数: 因此两 • 您不希望删除组件类别, 因为它可能使用其他控件。

• DllUnregisterServer 虽然有是 UnRegisterCLSIDInCategory 函数定义, 默认从注册表删除控件的项完全。 因此, 从控件注册删除类别是很少使用。

应编译和注册控件, 后, 在注册表中找到以下项:

HKEY_CLASSES_ROOT/Component

Categories/{7DD95801-9882-11CF-9FA9-00AA006C42C4}

HKEY_CLASSES_ROOT/Component

Categories/{7DD95802-9882-11CF-9FA9-00AA006C42C4}

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}2. ActiveX控件的发布要求

1)制作ActiveX空间的CAB包 :

创建 CAB 文件请参见

为 MFC 和 ATL 控件创建签名 CAB 文件本节内容描述如何创建在 Internet 上分发 ATL 和 MFC 控件的 CAB 文件。如果需要有关 CAB 文件的更多信息,请参见 Platform SDK 文档中的压缩文件参考一文(在 MSDN Library/Setup 和 System Administration/Setup/Setup API/Overview/Cabinet Files 目录下)。

创建 CAB 文件:

创建 INF 文件。

运行 CABARC 实用工具。

创建 INF 文件

INF 文件是一个文本文件,用以指定为控件的运行而需要显示或下载的文件(如 DLL 文件或其他 OCX 文件)。INF 文件使您得以将所有所需的文件捆绑在一个压缩的 CAB 文件中。默认情况下,版本号同用户硬盘上的现有文件相同的文件不下载。有关 INF 文件及其选项的更多信息,包括如何创建与平台无关的 INF 文件,请参见 Platform SDK 文档中的关于 INF 文件和使用 INF 文件(在 MSDN Library/Setup 和 System Administration/Setup/Setup API/Overview/Setup Applications 目录下)。

举例来说,下面的 INF 文件用于为 ATL Polygon 控件创建 CAB 文件。可通过从 Visual C++ CD 下载 ATL POLYGON 示例文件和生成 MinSize 版本来生成 POLYGON.DLL。如果生成了 Polygon 控件的 MinSize 版,还需要另外一个 DLL,即 ATL.DLL。由于需要在 POLYGON.DLL 之前注册 ATL.DLL,因此请将 ATL.DLL 放置在 INF 文件中的第一位:

; Sample INF file for POLYGON.DLL

[version]

; version signature (same for both NT and Win95) do not remove

signature="$CHICAGO$"

AdvancedINF=2.0

[Add.Code]

polygon.dll=polygon.dll

atl.dll=atl.dll

; needed DLL

[atl.dll]

file-win32-x86=thiscab

FileVersion=2,00,0,7024

DestDir=11

RegisterServer=yes

[polygon.dll]

file-win32-x86=thiscab

clsid={4CBBC676-507F-11D0-B98B-000000000000}

FileVersion=1,0,0,1

RegisterServer=yes

; end of INF file

此 INF 文件指定需要在系统上安装给定版本的 ATL.DLL。如果 ATL.DLL 尚未存在于系统中,它将从用此 INF 创建的 CAB 文件中下载。“thiscab”是一个关键字,表示 CAB 包含此 INF。也可通过指定一条绝对或相对路径,从一个 HTTP 位置下载所需的 DLL,例如:

file-win32-x86=http://example.microsoft.com/mydir/NEEDED.DLL

关键字“file-win32-x86”将平台标识为 x86 特定的。

可通过在 Windows 资源管理器中的文件上单击鼠标右键来获取文件的版本号。从显示的列表中选择“属性”,然后在显示的对话框中选择“版本”选项卡。有时需要在文件版本中额外插入一个 0。例如,在对话框中 ATL.DLL 的版本号显示为 2.00.7024。而在 INF 文件中,这变为 2, 00, 0, 7024。

“DestDir”是将要加载文件的目录所在的位置:11 指定系统目录为 WINDOWS/SYSTEM 或 WINNT/SYSTEM32;10 指定 Windows 目录、WINDOWS 或 WINNT。如果未指定任何 DestDir(典型情况),则代码安装在固定的 OCCACHE 目录中。

“clsid”是将要安装的控件的 CLSID。

创建了 INF 文件后,运行 CABARC 实用工具(可在 Mssdk/Bin 目录中找到)以创建 CAB 文件。应在包含源文件的目录下运行 CABARC。在命令行上,按源文件出现在 INF 中的顺序排列它们,并将 INF 文件放在最后。例如,若要从上面的 INF 文件生成 Polygon 控件的 CAB 文件,请使用下面的命令:

C:/MSSDK/BIN/CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF

POLYGON.CAB 文件包含一个 ATL.DLL 和 POLYGON.DLL 的压缩版本,同时还含有在 POLYGON.INF 文件中将其解压缩所需的信息。

有关如何分析及从 CAB 文件中解压缩组件的示例,请参见 http://msdn.microsoft.com/visualc/downloads/samples.asp(选择 CabView 链接)上 MSDN Online Code Center 中的 CabView 示例。

需要在 MFC 控件中包含的 DLL 文件有 MSVCRT.DLL、MFC42.DLL 和 OLEPRO32.DLL。

运行 CABARC 实用工具

可在 Mssdk/Bin 目录中找到 CABARC 实用工具。例如:

C:/MSSDK/BIN/CABARC -s 6144 n MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF

CABARC 创建一个称为 MYCTL.CAB 的 CAB 文件。

应在包含源文件(INF、OCX 和 DLL 文件)的目录下运行 CABARC。将在 CAB 文件中存档的文件应该按它们在 INF 文件中列出的同一顺序在命令行中列出。在上面的示例中,INF 文件应该将 NEEDED1.DLL 列在第一位,接下来是 NEEDED2.DLL,然后是 MYCTL.OCX。

-s 选项在压缩文件中保留用于代码签名的空间。n 命令指定希望创建 CAB 文件。有关 CABARC 命令和选项的列表,请在命令行上仅键入 CABARC:

C:/MSSDK/BIN/CABARC

浅析ActiveX控件的CAB压缩

任凤华

摘 要 本文简单介绍了CAB压缩,以及使用WinCAB将ActiveX控件压缩为CAB文件的具体步骤。

关键词 ActiveX控件;CAB压缩;WinCAB;INF文件

1. 引言

ActiveX控件技术是从OLE基础上发展起来的,是将OLE进行了扩展从而使其适应Internet、Intranet、商业应用程序等的开发。当ActiveX控件的程序代码在Internet上传输时,使用压缩技术传输程序代码变得非常有意义。

从另一方面来看,如果ActiveX控件还调用到其他的DLL程序模块,那么IE也必须把这些程序下载到本地来。为此,Microsoft采用了惯用的CAB压缩方法,它把ActiveX控件应用程序以及相关的其他文件放在同一个CAB文件中,然后在CODEBASE属性中指定CAB文件的URL路径。当IE找到CODEBASE属性时,它会自动解析URL地址从而把CAB文件解压到客户机的临时目录,然后注册有关文件,调用COM API函数创建ActiveX控件对象。这样就完成了ActiveX控件的传输。

2. CAB压缩技术简介

微软公司在发行Windows 95、Plus!95等软件时采用了一种全新的CAB压缩包形式,它具有压缩率高、安全性好、不易受到破坏等优点,深受广大用户及软件制作商的欢迎。许多用户甚至因此希望将自己的数据文件改用CAB压缩包的形式加以压缩、备份,以尽可能的减少备份文件所占用的磁盘空间,并提高它们的安全性。目前制作CAB文件的软件有主要有Cabarc和WinCAB。

Cabarc是一个用于压缩、列出压缩包中的文件、解压CAB文件的工具。Cabarc支持通配符和递归路径搜索。不过Cabarc使用一个类似于常用的压缩工具的命令行界面,

并且有较多的参数,与现在主流的Windows操作系统不太协调,使用起来不是很方便。

而WinCAB是一种可视化的全新的CAB压缩包制作软件,它具有采用图形界面、支持分卷压缩、可制作具有自解包功能的CAB压缩包(*.EXE文件格式)等优秀功能,这就从根本上解决了CAB压缩包的制作问题。需要注意的是在运行WinCAB.exe时,必须确保makecab.exe文件也在相同的目录下。

本文就以WinCAB为例来介绍ActiveX控件的CAB文件的制作过程。

3. 将ActiveX控件压缩成CAB文件

主要步骤有:

1)注册YourCtl.ocx控件。

2)建立YourCtl.inf文件。

INF文件的格式如下:(在使用Visual C++6.0的情况下)

[version]

signature="$CHICAGO$"

AdvancedINF=2.0

[Add.Code]

YourCtl.ocx=YourCtl.ocx

mfc42.dll=mfc42.dll

msvcrt.dll=msvcrt.dll

olepro32.dll=olepro32.dll

[YourCtl.ocx]

file-win32-x86=thiscab

clsid={YourCtl.ocx的CLSID} //在YourCtl.odl文件中可以找到

FileVersion=1,0,0,1

RegisterServer=yes

[msvcrt.dll]

FileVersion=6,0,8168,0

hook=mfc42installer

[mfc42.dll]

FileVersion=6,0,8168,0

hook=mfc42installer

[olepro32.dll]

FileVersion=5,0,4261,0

hook=mfc42installer

[mfc42installer]

file-win32-x86=VALUE=http://activex.microsoft.com/controls/vc/mfc42.cab

run= % EXTRACT_DIR % /mfc42.exe

这里需要说明的是上述msvcrt.dll、mfc42.dll、olepro32.dll的FileVersion是根据VC不同的版本而异的,例如在VC5.0sp3中就应该如下

olepro32.dll 5,0,4230,1

mfc42.dll 4,21,0,7303

msvcrt.dll 5,0,0,7303

每个VC版本都有不同的版本号,这里只介绍常见的两种。 另外mfc42installer的下载路径除了VC4.1和更早版本使用http://activex.microsoft.com/controls/vc/mfc40.cab外,其他版本都使用http://activex.microsoft.com/controls/vc/mfc42.cab。

3)启动WinCAB开始压缩。(其中注意Makecab.exe要在WinCAB目录下)

i)启动WinCAB,然后执行“Cabinet”菜单的“New”命令或单击快捷工具栏上的“New cabinet”按钮,准备制作新的CAB压缩包。

ii)单击快捷工具栏上的“Add file(s) to cabinet”按钮,打开“Add file(s) to cabinet”对话框。

iii)选择欲添加到CAB压缩包中的文件后单击“打开”按钮,将它们添加到WinCAB的文件列表中。这里只需要添加YourCtl.ocx和YourCtl.inf两个文件。

iv)在WinCAB快捷工具栏的“Cabinet path and name”框中输入或利用“Browse for path and name”按钮指定CAB压缩包的路径及文件名。

v)在“Cabinet size”栏中指定CAB压缩包的尺寸。

vi)在“Compression method”框中选择合适的压缩方式。

vii)单击“Save cabinet”按钮,WinCAB即会按照用户的要求进行压缩。

viii)压缩完成后,WinCAB会给出一个“WinCAB Report”的报告框,向广大用户报告有关文件个数、压缩前后的文件尺寸、压缩率、压缩时间等情况。至此,一个CAB文件就生成了。

4. 结束语

由于CAB的压缩率比我们常用的ARJ、ZIP、RAR等压缩包要高许多(约20%),从而进一步的减少了压缩文件所占用的磁盘空间,当采用该技术在Internet上传输ActiveX控件时既减少了网络流量,也加快了网页打开的速度。

另外,由于CAB压缩包具有“只读”属性,在创建完成后即不允许再作任何修改、删除,因此不易受到病毒、误操作等问题的影响,安全性也具有保证,实为广大用户在Windows 下进行文件的压缩、备份工作时的最佳选择。

注:**基金项目**,国家973计划,(编号:G1998030600)。

关于证书和签名 -|zuiwanting 发表于 2006-5-24 9:58:00

/Program Files/Microsoft Visual Studio .NET 2003/SDK/v1.1/Bin下有关于证书和签名相关工具

1。Makecert.exe ---证书创建工具

2。Cert2Spc.exe ---发行者证书测试工具

3。Signcode.exe ---文件签名工具

建立自己的根证书:

makecert -sk myPK -ss myName -n "CN=LUO31工作室" -r c:/luo31.cer

sk-表示主题的密钥容器位置,ss-主题的证书存储名称, n-证书颁发对象,r-证书存储位置;

如果你需要导出私钥文件,请不要使用sk,而换作s,eg:makecert -ss myName -n "CN=LUO31工作室" -sv c:/luo31.pvk -r c:/luo31.cer

建立自根证书授权的子证书:

makecert -sk "myPK" -is myName -n "CN=luo31" -$ commercial -ic c:/luo31.cer c:/31.cer

sk-表示主题的密钥容器位置,is-颁发者的证书存储名称, n-证书颁发对象,ic-颁发者的证书存储位置,-$-授权范围(用于代码签名);

使用Cert2Spc生成spc发行者证书(可选):

cert2spc c:/31.cer c:/31.spc

使用signcode为你的程序,库或cab包签名:

双击signcode,或在控制台键入signcode,不带参数会启动签名向导。在第三步选择“自定义选项”,第四步选择“从文件选择”选择31.spc或31.cer,第五步选择“CSP中的私钥”,在密钥容器中选择我们定义的myPK,其他步骤默认即可,如果想添加时间戳,请在时间戳服务器地址上键入:(免费时间戳认证)http://timestamp.verisign.com/scripts/timstamp.dll ;

完成后,观察你所签名的文件属性,应该已经添加数字签名项

3. ActiveX控件在页面上的引用

<OBJECT id="axGraphOcxSCADA" style="Z-INDEX: 102; LEFT: 160px; WIDTH: 784px; POSITION: absolute; TOP: 80px; HEIGHT: 536px"

codeBase="GraphOcx.CAB#version=1,0,0,3" classid="clsid:87186EA1-4D89-4F3E-9D25-1F03F0DDDB95"

name="axGraphOcxSCADA" VIEWASTEXT>

<PARAM NAME="_Version" VALUE="65536">

<PARAM NAME="_ExtentX" VALUE="20743">

<PARAM NAME="_ExtentY" VALUE="14182">

<PARAM NAME="_StockProps" VALUE="0">

</OBJECT>

 

本文地址:http://www.45fan.com/dnjc/73664.html
Tags: 控件 Web ActiveX
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部