您的位置  > 互联网

微软推出实例化COM注册表的方式替代和使用方法

通常,在实例化一个COM组件(包括使用该技术的DLL/控件)之前,需要先注册该组件或控件。 从XP sp2开始,微软提供了另一种使用方法(文件列表)。 详细信息请参阅最后的 MSDN 参考资料。 由于COM的注册信息需要写入注册表,一方面给win7以后没有管理员身份的应用程序带来了麻烦。 另一个一直存在的问题是所谓的DLL Hell,造成同一控件的不同版本之间的干扰。 。 MS在推出.Net时,采用了汇编的方式来避免这个问题。 同时,它还采用了文件列表的方式,给COM带来了新的调用方案。 由于不需要将类信息写入注册表,因此COM文件的放置位置也发生了变化。 可以放在exe所在文件夹或其子目录下,自然就避免了DLL Hell的问题。

文件清单是XML格式的文本文件,文件名带有后缀(例如:程序名为a.exe,则清单文件名为a.exe.)。 创建类实例时,操作系统(实际上是ole32.dll的API函数)会首先检查清单文件是否存在。 如果存在有效的文件,那么从注册表获取COM信息的过程就转化为从文件中读取。这个文件有很多功能,比如:指定运行时的操作身份权限、是否使用系统主题、并描述这里提到的COM注册信息,...等等。

如果你使用的是vfp9,当你将其构建成exe并打开exe时,你会发现有一个序列号为24的资源,其内容为:

(图片1)

是不是和前面提到的MSDN文章中的文件类似? 如果你用打开这个exe。 你会发现这个24号资源,是一个叫list的内容:

(图二)

也就是说,vfp9的exe编译时,会默认生成一个

由于默认情况下内置的优先于外部的,所以我们只需要写一个新的加上COM类声明,重新编译的exe就实现了免注册的功能。 很多人可能不知道的一件事是,vfp9在编译exe时,如果找到与要编译的exe同名的文件,就会用它替换默认的文件。

下面我们来验证一下:

1.创建COM用于测试

A。 创建一个新项目->

b. 代码->新建,粘贴以下内容并保存为mycom.prg

Define Class myComFunc as Session olepublic
Function getName()
    Return 'dkfdtf'
EndFunc
EndDefine

C。 编译成dll

2.创建一个测试EXE

A。 新项目->测试

b. Code -> New,粘贴以下内容并保存为test.prg

Local oo, cc
Try
    oo = NewObject('mycom.myComFunc')
    cc = oo.getName()
    MessageBox("RegFree COM: value = " + cc)
Catch
    MessageBox('无法创建 COM 对象.')
EndTry

C。 编译成exe

3. 运行这个exe,你应该会看到一个像这样的对话框:

(图3)

4. 现在使用 /u .dll 注销该 COM,您应该看到以下内容:

(图4)

OK,一切与情况一致,无需使用免注册技术。

现在我们来实现免注册功能。 下面的内容仅介绍如何在不注册的情况下实现自己的应用程序的步骤和方法。 如果您只是想了解更多信息,只需下载以下示例包并运行它,其中包含以下代码。

1、在项目所在的文件夹中新建一个文本文件,按照上面的方法打开exe,找到24号资源,将内容复制粘贴到新的文本文件中,最后重命名为test.exe。

,然后使用工具包中的mt或者提取mycom.dll中的注册信息并添加。 全部内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>


 
Visual FoxPro

    
        
             
        
    

 




 

    
        
    

注:以上内容直接从test.exe的24号资源中复制过来,并添加了...COM类描述信息部分; 为了简单起见,这里只添加必要的类描述元素。 另外,如果mycom.dll和test.exe不在同一个文件夹中,则需要添加路径部分,可以是相对路径,也可以是绝对路径。 添加的GUID值也可以直接在mydll.vbr中找到。 如果是第三方控件,大多数情况下你没有这个vbr文件,所以我为你提供了上面的工具包来从dll/ocx中提取这个信息。 使用方法非常简单:

使用mt提取:mt.exe -tlb:TBL文件名 -dll:DLL/OCX文件名 -out:输出结果文件名.txt 如果没有专门提供TBL文件,TBL将使用DLL/OCX文件

提取:.exe mycom.dll

这两种工具都有缺陷。 mt缺乏项目信息。 Win7及以上版本即使以管理员权限运行也可能失败。 XP下运行没有问题。

2.重新编译test.exe,vfp会使用上面的文件替换默认的(资源号24)

3. 运行测试,您应该能够再次看到图 3 中的屏幕。 反复注册和注销mycom.dll,结果应该是相同的,这意味着无论COM是否注册,都可以正常使用; 更极端的是,你只需将 mycom.dll 和 test.exe 这两个文件复制到其他有 vfp 运行的文件中即可。 在图书馆的机器上,无需注册即可正常运行。

验证示例:.rar

参考:

COM的Reg-Free(免注册)技术介绍及实例

- 不含 COM :A

:来自 DLL 的 SxS 文件 -Free COM

--------------------------