ActiveX综述 升级 CAB创建

ActiveX技术综述... 1

1.2. ActiveX的内容... 1

1.3. ActiveXJava的比较... 1

2. ActiveX控制和Internet 1

3. ActiveX文档和Internet 2

6. Visual C++ 5.0ActiveX的支持... 2

升级现有的 ActiveX 控件... 4

CODEBASE 标记... 4

创建 CAB 文件... 4

创建 CAB 文件... 7

DLLRegisterServer失败?. 9

 

ActiveX技术综述

ActiveXMicrosoft提出的一组使用COMComponent Object Model,部件对象模型)使得软件部件在网络环境中进行交互的技术集。它与具体的编程语言无关。作为针对Internet应用开发的技术,ActiveX被广泛应用于WEB服务器以及客户端的各个方面。同时,ActiveX技术也被用于方便地创建普通的桌面应用程序。

1.2. ActiveX的内容

  ActiveX既包含服务器端技术,也包含客户端技术。其主要内容是:

  * ActiveX控制(ActiveX Control:用于向WEB页面、Microsoft Word等支持ActiveX的容器(Container)中插入COM对象。

  * ActiveX文档(ActiveX Document):用于在WEB Browser或者其它支持ActiveX的容器中浏览复合文档(非HTML文档),例如Microsoft Word文档,Microsoft Excel文档或者用户自定义的文档等。

  * ActiveX脚本描述(ActiveX Scripting):用于从客户端或者服务器端操纵ActiveX控制和Java程序,传递数据,协调它们之间的操作。

  * ActiveX服务器框架(ActiveX Server Framework):提供了一系列针对WEB服务器应用程序设计各个方面的函数及其封装类,诸如服务器过滤器、HTML数据流控制等。

  * Internet Explorer中内置Java虚拟机(Java Virtual Machine),从而使Java Applet能够在Internet Explorer上运行,并可以与ActiveX控制通过脚本描述语言进行通信。

1.3. ActiveXJava的比较

  ActiveX提供了一种扩展包括Java在内的任何编程语言的机制,Java的开发人员可以在Applet中使用ActiveX技术,直接嵌入ActiveX控制,或者以ActiveX技术为桥梁,将其它开发商提供的多种语言的程序对象集成到Java中。与Java的字节码技术相比,ActiveX提供了“代码签名”(Code Signing)技术保证其安全性。

2. ActiveX控制和Internet

  ActiveX控制OLE控制的更新版本。控制(Control是建立可编程部件(Component)的主要元素。ActiveX控制可以用于所有支持COM规范的容器中,或者作为Internet控制嵌入到WEB页面中。用户访问该页面时将下载该控制并自动在本地注册利用脚本描述语言(Script)可以在控制之间以及客户与服务器之间通过设置属性(Property)、调用方法(Method)和激活事件(Event)进行通信

  ActiveX控制与以前的OLE控制相比,具有更少的接口,并且可以没有窗口。所有的ActiveX控制都支持IUnknown接口。

  目前,很多第三方开发商编制了各式各样的ActiveX控制。在Internet上,有超过1000ActiveX控制供用户下载使用。在WINDOWSSYSTEM目录下,保存有很多Window提供的ActiveX控制。Microsoft Visual C++(以下简称VC)提供的MFCMicrosoft Foundation Classes)控制都是ActiveX控制。

  考虑到当前Internet相对较低的传输速率,设计运行于InternetActiveX控制时,必须考虑以下几个问题:

  * 控制尽可能小;

  * 持续存储数据(Persist Data)如何保存;

  * 如何在Internet上下载和安装;

  * 控制如何在客户端注册;

3. ActiveX文档和Internet

  ActiveX文档提供了传统的嵌入对象的扩展方法。ActiveX文档对象可以包含多个页,显示在整个客户区中,并支持原有的菜单功能。与以往的嵌入对象不同的是,ActiveX文档对象不再以一个阴影方框包围来显示,而是全框架(Full Frame),并总处于激活状态

  Microsoft Office97提供了Microsoft Office Binder,用来生成并浏览由Microsoft WordMicrosoft Excel或者用户定义的ActiveX文档等构成的复合文档,每一种文档类型都可以直接进行编辑修改。

  ActiveX文档可以作为对象嵌入到WEB网页中,在WEB上发布。

4. ActiveX脚本描述语言

  利用VBScript或者Microsoft JScript,可以向Web页面中加入可用于交互的ActiveX控制,将数据预处理或者检验过程放在客户端进行,然后将结果传往WEB服务器。

5. ActiveX服务器框架

  在WEB服务器上创建扩展应用程序,动态生成WEB页面。使用MFC提供的ISAPI类可以方便地建立WEB服务器端的扩展应用程序。

6. Visual C++ 5.0ActiveX的支持

  VC++ 5.0(企业版)为Internet开发提供了完整的解决发案,其内容是:

  * 使用MFC或者ATL开发ActiveX控制和ActiveX文档。

  * 使用ISAPI设计WEB服务器端的部件。

  * 使用WinInet 开发通过Internet存取文件的应用程序。

  * 使用Asynchronous Monikers生成从Internet下载数据的应用程序。

  * 使用ActiveX SDK开发其它类型的基于InternetWin32应用程序,包括ActiveX Scripting HostMicrosoft WebConferencing等。

6.1. VC5.0开发ActiveX控制

  VC++5.0提供两个途径开发ActiveX控制:MFCATLActive Template Library)。使用MFC可以不必理会控制接口的细节,把注意力集中在控制本身的功用上,但是生成的控制比较大。而且,客户端如果要运行此ActiveX控制,必须拥有相应版本的MFC类库的DLL,否则,必须同时下载这些巨大的类库;使用ATL由于不涉及MFC的标准类库,生成的控制相对较小,但开发者必须了解COMOLE技术的细节。大多数情况下,可以使用MFC开发ActiveX控制,这样比较容易。

而且,由于Internet Explorer 3.0提供了MFC 4.1的类库,而Internet Explorer 3.0Windows95提供的组件,所以,只要ActiveX控制使用的是MFC 4.1或者更早的版本,多数情况下不需要下载MFC的类库。

  使用MFC开发ActiveX控制,可以用MFC ActiveX Control Wizard生成工程框架。VC会自动产生三个类:(假设MyName是控制的名字。)

  * CMyNameApp:从类COleControlModule派生,而类COleControlModule则派生自CWinApp

  * CMyNameCtrl:从类COleControl派生,而类COleControl则派生自CWnd

  * CMyNamePropPage:从类COlePropertyPage派生,而类COlePropPage则派生自CDialog

  可以看出,这个框架与一般的MFC应用程序有些类似。开发人员的大部分工作在CMyNameCtrl中,例如用Class Wizard添加属性、方法和事件,处理显示等

  编译生成OCX文件后,用VC提供的ActiveX Test Container测试这个控制,也可以用OLE/COM Object Viewer浏览此控制的接口信息及类型库。

6.2. ActiveX控制在WEB上的应用

  考虑到WEB的安全性,为了在服务器与客户端建立良好的信任关系,必须为每个在WEB上使用ActiveX控制设置一个“代码签名”(Code Signing)。VC5.0提供了生成供测试用的“代码签名”的工具。如果要正式发布,则必须向有关机构申请。(参见http//www.microsoft.com/intdev/signcode/

  WEB页面中使用ActiveX控制,还要对之进行包装,将有关的动态连接库及信息文件压缩到一个扩展名为CABCabinet)文件中。可以使用VC5.0提供的工具包装ActiveX控制。在HTML文件中,使用OBJECT标签插入ActiveX控制,并利用VBScript或者JScript访问该ActiveX控制。客户端用Internet Explorer浏览此页面时,可以自动解包该文件。出于安全性的考虑,Internet ExplorerActiveX 部件的下载、初始化、是否拥有合法的代码签名以及是否允许Scripting等设置了不同的安全级别,用户可根据需要进行设置。下面这个例子中,使用了ActiveX控制"MSChart.OCX",当用鼠标单击此控制时,控制的标题将改变。

  〈OBJECT

  CLASSID="clsid31291E80-728C-11CF-93D5-0020AF99504A"

  CODEBASE="MSCHART.CAB#version=1000"

  ID=chart1

  WIDTH=400

  HEIGHT=200

  ALIGN=center

  〉

  〈/OBJECT

 

  〈SCRIPT language = "VBScript"

  Sub chart1_Click()

  Document.chart1.TitleText="My Title"

    End Sub

  这里,必须提供该OCXClassID和文件路径或URL。客户端浏览此页面时,先在本地的注册表中查找该ClassID,如果存在,则不必下载。否则,必须按照CODEBASE指定的路径搜索该控制并下载。标签Object中的ID是该OCX的对象的名称,用来访问和设置对象属性,调用对象方法等。

 

 

升级现有的 ActiveX 控件

现有的 ActiveX 控件(即以前的 OLE 控件)不用修改即可用于 Internet。但是,您可能希望修改控件以提高它们的性能。当在 Web 页上使用控件时,还需要考虑其他一些问题。.ocx 文件和其他的支持文件必须位于目标计算机上或从 Internet 上下载。这使代码大小和下载时间成为重要的考虑因素。下载可打包在签名 .cab 文件中。可将控件标记为对脚本撰写是安全的和对初始化是安全的。

也可以添加优化,详见 ActiveX 控件:优化。名字对象可用于异步下载属性和较大的 BLOB,详见 Internet 上的 ActiveX 控件。

CODEBASE 标记

ActiveX 控件使用 <OBJECT> 标记嵌入 Web 页中。<OBJECT> 标记的 CODEBASE 参数指定应从何处下载控件。CODEBASE 可成功指向许多不同的文件类型。

OCX 文件使用 CODEBASE 标记

CODEBASE=http://example.microsoft.com/mycontrol.ocx#version=4,70,0,1086

此解决方案仅下载控件的 .ocx 文件,并要求所有的支持 DLL 均已安装在客户机上。它适用于 Internet Explorer 和使用 Visual C++ 生成的 MFC ActiveX 控件,因为 Internet Explorer 带有对 Visual C++ 控件的 DLL 支持。如果使用其他支持 ActiveX 控件的 Internet 浏览器查看此控件,则此解决方案无效。

INF 文件使用 CODEBASE 标记

CODEBASE=http://example.microsoft.com/trustme.inf

.inf 文件控制 .ocx 文件及其支持文件的安装不推荐使用此方法,因为不可能签名 .inf 文件(有关代码签名的指针,请参见签名代码)。

CAB 文件使用 CODEBASE 标记

CODEBASE=http://example.microsoft.com/acontrol.cab#version=1,2,0,0

推荐使用压缩文件将使用 MFC ActiveX 控件打包。通过在压缩文件中打包 MFC ActiveX 控件,可以包含一个 .inf 文件来控制 ActiveX 控件以及任何依赖 DLL(如 MFC DLL)的安装。使用 CAB 文件可自动压缩代码,从而加快下载速度。如果使用 .cab 文件进行组件下载,则签名整个 .cab 文件要比分别签名每个组件快

创建 CAB 文件

CODEBASE 指向的压缩文件中,应包含用于 ActiveX 控件的 .ocx 文件和一个控制控件安装的 .inf 文件应通过指定控件文件和 .inf 文件的名称来创建压缩文件。不要在此压缩文件中包含可能已经存在于系统中的依赖 DLL。例如,应将 MFC DLL 打包在一个单独的压缩文件中,并通过控制 .inf 文件引用它。

有关如何创建 CAB 文件的详细信息,请参见下文。

INF 文件

下面名为 spindial.inf 的文件示例列出了 MFC Spindial 控件所需的支持文件和版本信息。请注意,MFC DLL 的位置是一个 Microsoft Web 站点。mfc42.cab Microsoft 提供并签名。

Contents of spindial.inf:

[mfc42installer]

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

[Olepro32.dll] - FileVersion=5,0,4261,0

[Mfc42.dll] - FileVersion=6,0,8168,0

[Msvcrt.dll] - FileVersion=6,0,8168,0<OBJECT> 标记

 

下面的示例阐释了如何使用 <OBJECT> 标记打包 MFC Spindial 示例控件

<OBJECT ID="Spindial1" WIDTH=100 HEIGHT=51

  CLASSID="CLSID:06889605-B8D0-101A-91F1-00608CEAD5B3"

  CODEBASE="http://example.microsoft.com/spindial.cab#Version=1,0,0,001">

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

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

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

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

    <PARAM NAME="NeedlePosition" VALUE="2">

</OBJECT>

 

在此例中,spindial.cab 包含 spindial.ocx spindial.inf. 两个文件。下面的命令将生成此压缩文件:

C:/CabDevKit/cabarc.exe -s 6144 N spindial.cab spindial.ocx spindial.inf 参数 –s 6144 在压缩文件中保留了用于代码签名的空间。

版本标记

这里请注意,用 CAB 文件指定的 #Version 信息应用于 <OBJECT> 标记的 CLASSID 参数指定的控件。

根据所指定的版本,可强制进行控件下载。有关包含 CODEBASE 参数的 OBJECT 标记的完成规范,请参见 W3C 参考资料。

将控件标记为脚本安全和初始化安全

如果 Web 页使用的 ActiveX 控件的确是安全的,则应将它们标记为脚本安全和初始化安全。一个安全的控件不会执行磁盘 IO 或直接访问计算机的内存或寄存器。

可通过注册表将控件标记为脚本安全或初始化安全。修改 DllRegisterServer 添加类似于下面这样的项,在注册表中将控件标记为脚本安全和持久性安全。另外一种方法是实现 IObjectSafety

为控件定义 GUID(全局唯一标识符)以将其标记为脚本安全和持久性安全。可安全写入脚本的控件应包含类似于下面这样的注册表项:

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

使用类似于下面这样的注册表项,将可安全地从持久性数据初始化的控件标记为安全:

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

添加类似于下面这样的项(用控件的类 ID 取代 {06889605-B8D0-101A-91F1-00608CEAD5B3}),使您的键同下列类 ID 相关联

HKEY_CLASSES_ROOT/CLSID/{06889605-B8D0-101A-91F1-00608CEAD5B3}/Implemented Categories/{7DD95801-9882-11CF-9FA9-00AA006C42C4}

HKEY_CLASSES_ROOT/CLSID/{06889605-B8D0-101A-91F1-00608CEAD5B3}/Implemented Categories/{7DD95802-9882-11CF-9FA9-00AA006C42C4}

授权问题

如果希望在 Web 页上使用授权控件,则必须验证许可协议是否可以在 Internet 上使用,并为其创建一个授权包文件 (LPK)

对于授权的 ActiveX 控件,如果运行 Internet Explorer 的计算机未获得使用该控件的许可,则该控件将不会正确地加载在 HTML 页中。例如,如果是使用 Visual C++ 生成的授权控件,则使用该控件的 HTML 页将在生成该控件的计算机上正确加载,但其他的计算机除非包含授权信息,否则该页将不会加载到这些计算机上。

若要在 Internet Explorer 中使用授权的 ActiveX 控件,必须检查供应商的许可协议,验证控件的许可协议是否允许:

l         重新发布

l         Internet 上使用该控件

l         使用 Codebase 参数

若要在一台未授权的计算机上的 HTML 页中使用授权控件,则必须生成一个授权包文件 (LPK)LPK 文件包含 HTML 页中授权控件的运行时许可。此文件通过 ActiveX SDK 附带的 LPK_TOOL.EXE 生成。有关更多信息,请参见 MSND Web 站点 http://microsoft.com/china/msdn

创建 LPK 文件

1.         在授权的计算机上运行 LPK_TOOL.EXE 以使用控件。

2.         在“许可包创作工具”对话框中的“可用控件”列表框内,选择将用于 HTML 页的每个授权 ActiveX 控件,并单击“添加”。

3.         单击“保存并退出”并为 LPK 文件键入名称。这将创建 LPK 文件并关闭应用程序。

HTML 页上嵌入授权控件

1、编辑 HTML 页。在 HTML 页中,将 License Manager 对象的 <OBJECT> 标记插入到任何其他的 <OBJECT> 标记之前。License Manager 是一个用 Internet Explorer 安装的 ActiveX 控件,其类 ID 如下所示。将 License Manager 对象的 LPKPath 属性设置为 LPK 文件的路径和名称。每个 HTML 页只能有一个 LPK 文件。

<OBJECT CLASSID = "clsid:5220cb21-c88d-11cf-b347-00aa00a28331">

    <PARAM NAME="LPKPath" VALUE="relative URL to .LPK file">

</OBJECT>

2、将授权控件对象的 <OBJECT> 标记插入到 License Manager 标记之后。

例如,一个显示 Microsoft Masked Edit 控件的 HTML 页如下所示。第一个类 ID License Manager 控件的,第二个类 ID Masked Edit 控件的。更改标记,使其指向先前创建的 .lpk 文件的相对路径,并添加包含控件类 ID 的对象标记。

3、如果使用 NCompass ActiveX 插件,则为 LPK 文件插入 <EMBED> 属性。

如果控件可以在其他支持 Active 的浏览器中查看(例如使用 NCompass ActiveX 插件的 Netscape),则必须添加如下 <EMBED> 语法。

<OBJECT CLASSID="clsid:5220cb21-c88d-11cf-b347-00aa00a28331">

    <PARAM NAME="LPKPath" VALUE="maskedit.lpk">

    <EMBED SRC = "maskedit.LPK">

</OBJECT>

<OBJECT CLASSID="clsid:C932BA85-4374-101B-A56C-00AA003668DC" WIDTH=100 HEIGHT=25>

</OBJECT>有关控件授权的更多信息,请参见 ActiveX 控件:授权 ActiveX 控件。

签名代码

代码签名旨在标识代码的来源并保证代码自签名后没有被更改。根据浏览器的安全性设置,用户可能会在下载代码之前收到警告。用户可以选择信任某些证书的所有者或公司,在这种情况下,下载由那些可信的所有者和公司签名的代码时没有警告。代码带数字签名以免被篡改。

确保为最终代码加上签名,以便可以自动下载控件而不显示信任警告消息。有关如何签名代码的详细信息,请查看 ActiveX SDK 中有关 Authenticode™ 的文档,并参阅签名 CAB 文件。

根据信任级别和浏览器的安全性级别设置,可能会显示一个证书以识别签名个人和公司。如果不存在安全性级别,或者如果为控件签名的证书所有者是可信的,则不会显示证书。有关浏览器的安全性设置如何确定是否下载控件及是否显示证书的详细信息,请参见 Internet Explorer 浏览器的安全性级别和控件行为。

数字签名保证代码自签名后未被更改过。证书中采用和嵌入一堆杂乱的代码。这堆代码随后将与在这堆代码下载后但尚未运行前所采用的一堆代码进行比较。诸如 Verisign 这样的公司可以提供签名代码所需的私匙与公匙。ActiveX SDK 带有 MakeCert(一个创建测试证书的实用工具),以及 wvtston.reg wvtstoff.reg 这两个注册文件,用于指定浏览器是否应将测试证书识别为有效。

管理调色板

容器确定调色板并使其可用作环境属性 DISPID_AMBIENT_PALETTE。容器(例如 Microsoft Internet Explorer)选择一个调色板,由所有 ActiveX 控件在页上用来确定自己的调色板。这将防止闪烁并显示持续的外观。

控件可通过重写 OnAmbientPropertyChange 来处理对调色板更改的通知。

控件可重写 OnGetColorSet 以返回绘制调色板的颜色设置。容器使用返回值确定控件是否识别调色板。

根据 OCX 96 指南,控件必须总是在背景中实现其调色板。

较旧的容器不使用环境调色板属性,它们将发出 WM_QUERYNEWPALETTE WM_PALETTECHANGED 消息。控件可通过重写 OnQueryNewPalette OnPaletteChanged 来处理这些消息。

Internet Explorer 浏览器的安全性级别和控件行为

浏览器具有可由用户配置的安全性级别选项。由于 Web 页可能包含某些或许会损害用户计算机的活动内容,浏览器允许用户选择安全性级别选项。根据浏览器实现安全性级别的方式,控件可能根本不会下载,或者可能显示一个证书或警告消息,使用户可以在运行时选择是否下载控件。下面列出了 Internet Explorer 上高级、中级和低级安全性级别下 ActiveX 控件的行为。

 

创建 CAB 文件

http://msdn.microsoft.com/zh-cn/library/cc468356(VS.71).aspx

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

创建 CAB 文件:

1、创建 INF 文件。

2、运行 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/SYSTEM3210 指定 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.DLLMFC42.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 文件。

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

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

 

 

DLLRegisterServer失败?

运行Regsvr32 C:/WINDOWS/system32/Macromed/Flash/flash9a.ocx后提示

C:/WINDOWS/system32/Macromed/Flash/flash9a.ocx中的DLLRegisterServer失败,返回码0x80070005

这是怎么回事,如何弄好?

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

regsvr32命令
这里有很多Regsvr32命令,看了后就明白了 Regsvr32命令修复系统故障实例使用过activex的人都知道,activex不注册是不能够被系统识别和使用的,一般安装程序都会自动地把它所使用的activex控件注册,但如果你拿到的一个控件需要手动注册怎么办呢?如果修改注册表那就太麻烦了,在windowssystem文件夹下有一个regsvr32.exe的程序,它就是windows自带的activex注册和反注册工具。
2000系统的regsvr32.exewinnt/system32文件夹下;
WInXP系统的regsvr32.exewindows/system32文件夹下
regsvr32的用法为:"regsvr32 [/s] [/n] [/i(:cmdline)] dllname”。其中dllnameactivex控件文件名,建议在安装前拷贝到system文件夹下。 
参数有如下意义: 
/u——反注册控件 
/s——不管注册成功与否,均不显示提示框 
/c——控制台输出 
/i——跳过控件的选项进行安装(与注册不同) 
/n——不注册控件,此选项必须与/i选项一起使用
执行该命令的方法:
1、可以在开始”--“运行,调出运行的对话框,也可以使用Win+R热键,然后直接在输入栏输入即可
2、在开始--运行 输入cmd,调出命令提示符窗口,然后再执行regsvr32命令。
Regsvr32错误消息的说明
当使用 Regsvr32.exe 时,它会尝试加载该组件并调用它的 DLLSelfRegister 函数。如果此尝试成功,Regsvr32.exe 会显示一个指示成功的对话框。如果此尝试失败,Regsvr32.exe 会返回一条错误消息,其中可能会包括一个 Win32 错误代码。
以下列表介绍了 RegSvr32 错误消息和可能的原因。 
 
1Unrecognized flag:/invalid_flag 
键入的标志或开关组合无效(请参阅本文中的“Regsvr32.exe 的用法一节)。  
2No DLL name specified. 
未包括 .dll 文件名(请参阅本文中的“Regsvr32.exe 的用法一节)。 
3Dllname was loaded, but the DllRegisterServer or DllUnregisterServer entry point was not found. 
Dllname不是.dll .ocx 文件。例如,键入 regsvr32 wjview.exe 就会生成该错误消息。 
例如,键入regsvr32 icwdial.dll 后就会返回该错误消息,因为 Icwdial.dll 文件不能自行注册。如果您怀疑内存中有损坏的Dllname 版本,请尝试重新启动计算机,或重新提取该文件的原始版本。如果您运行的是 Windows NT,可能需要使用 Microsoft Windows NT Server 4.0 资源工具包 中的 Kill  Pview 工具。有关其他信息,请单击以查看以下 Microsoft 知识库文章:197155 如何终止孤立进程OleInitialize failed (or OleUninitialize failed). 
Regsvr32 必须先初始化 COM 库,然后才能调用所需的 COM 库函数并在关闭时撤消对该库的初始化。 

4Unrecognized flag:/invalid_flag

  键入的标志或开关组合无效(请参阅本文中的“Regsvr32.exe 的用法”一节)。

5No DLL name specified.

  未包括 .dll 文件名(请参阅本文中的“Regsvr32.exe 的用法”一节)。

6Dllname was loaded, but the DllRegisterServer or DllUnregisterServer entry point was not found.

  Dllname 不是 .dll .ocx 文件。例如,键入 regsvr32 wjview.exe 就会生成该错误消息。

7Dllname is not an executable file and no registration helper is registered for this file type.

  Dllname 不是可执行文件(.exe.dll .ocx)。例如,键入 regsvr32 autoexec.bat 就会生成该错误消息。

8Dllname was loaded, but the DllRegisterServer or DllUnregisterServer entry point was not found.

  Dllname 可能未导出,或者内存中可能有损坏的 Dllname 版本。请考虑使用 Pview 来检测该文件并删除它。

9Dllname is not self-registerable or a corrupted version is in memory.

  例如,键入 regsvr32 icwdial.dll 后就会返回该错误消息,因为 Icwdial.dll 文件不能自行注册。如果您怀疑内存中有损坏的 Dllname 版本,请尝试重新启动计算机,或重新提取该文件的原始版本。如果您运行的是 Windows NT,可能需要使用 Microsoft Windows NT Server 4.0 资源工具包 中的 Kill Pview 工具。有关其他信息,请单击以查看以下 Microsoft 知识库文章:

  197155 如何终止孤立进程

10OleInitialize failed (or OleUninitialize failed).

  Regsvr32 必须先初始化 COM 库,然后才能调用所需的 COM 库函数并在关闭时撤消对该库的初始化。如果对 COM 库进行初始化或撤消初始化的尝试失败,就会出现这些错误消息。例如,Ole32.dll 文件可能已经损坏,或者其版本有误。

11LoadLibrary("Dllname") failed.GetlastError returns 0x00000485

  在 Winerror.h 中,0x00000485 = 1157 (ERROR_DLL_NOT_FOUND),表示“找不到运行该应用程序所需的某个库文件”。例如,键入 regsvr32 missing.dll 后,如果找不到 Missing.dll 文件,就会返回该错误消息。

12LoadLibrary("Dllname") failed.GetLastError returns 0x00000002

  在 Winerror.h 中,0x00000002 = 2 (ERROR_FILE_NOT_FOUND),表示“系统找不到指定的文件”。换言之,系统找不到相关的 DLL。例如,如果键入 regsvr32 icwdial.dll,而此时缺少 Tapi32.dll(依赖项),就会返回该错误消息。

13LoadLibrary("dskmaint.dll") failed.GetLastError returns 0x000001f

  在 Winerror.h 中,0x000001f = 31 (ERROR_GEN_FAILURE),表示“附加到系统上的设备不能正常工作”。如果您尝试注册 Win16 .dll 文件,就会发生此现象。例如,键入 regsvr32 dskmaint.dll 会返回该错误消息。

14DllRegisterServer (or DllUnregisterServer)in Dllname failed.返回代码是:字符串

  在 Winerror.h 中搜索字符串。

  Regsvr32.exe 和依赖项

  RegSvr32.exe 依赖于 Kernel32.dllUser32.dll Ole32.dll 文件(在 Windows NT 中,还依赖于 Msvcrt.dll Advapi32.dll 文件)。Regsvr32.exe 会加载您尝试注册或撤消注册的文件及其所有依赖项。如果缺少必需的文件或者它们已损坏,该进程可能会失败。

  您可以使用 Depends.exe 来确定您尝试注册或撤消注册的文件的依赖项。在 Microsoft Windows 98 资源工具包 和 Microsoft Windows NT 4.0 资源工具包 支持工具中都提供了 Depends.exe

  247024 Tools Included with the Microsoft Windows 98 Resource Kit

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

  其实系统中有两种DLL,一种是不需注册即可使用的,另一种则是必须经过系统登录(即注册)才能使用的。就好像一个临时工,和一个记录在员工名单上的长期合同工的区别一样。如何才能区分这两种DLL呢?方法很简单,用刚才的Depends打开这个DLL,同样是看函数输出表,如果其中包含以下两个函数(前者是注册DLL,后者是反注册DLL),那么就一定是需要注册才能使用的DLL了。   DllRegisterServer  ||  DllUnregisterServer 
  而regsvr32这个命令,实际上就是调用DLL中的这两个函数(“regsvr32 /u DLL文件名调用的即为DllUnregisterServer反注册函数) 

 

DLL有两种,一种是标准DLL,另一种是ActiveX DLL。只有ActiveX DLL中包括DllRegisterServer函数,才能进行注册,才能被ASP调用。而标准的DLL虽然可以被VB等工具调用,但无法使用RegSvr32注册,也不能被ASP直接调用。标准DLLActiveX DLL的调用完全不同。

要在VC中建立工程时选择ATL COM AppWizard,选择DLL方式,这样可以建立ActiveX DLL。生成工程后,在ClassView窗口的Classes上右击,从菜单上选择New ATL Object,然后选择添加ActiveX Server Component,你需要为该类添加你自己的方法和属性。编译后生成的DLL经过注册就可以被ASP调用,

 

C#作的组件不是用regsvr32注册的, 而是用regasm来注册。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值