在 VB6 中,传统加载 COM DLL 的方式是通过regsvr32注册,这会将组件信息写入系统注册表。
免注册加载(Registration-Free COM)是一种让应用程序在不修改注册表的情况下直接加载 DLL 的技术。主要有两种主流实现方式:
1. 使用 Manifest 清单文件(推荐)
这是 Windows XP 以后引入的标准方案。它通过一个.manifest文件告诉 Windows 操作系统 DLL 的位置和 CLSID 信息。
实现步骤:
创建 DLL 的 Manifest 文件:描述 DLL 包含的类和接口。
创建 EXE 的 Manifest 文件:声明对 DLL 的依赖。
部署:将 EXE、DLL 和两个 Manifest 文件放在同一个目录下。
优点: 完全符合系统标准,支持直接通过 New 关键字或 CreateObject 实例化对象。
工具推荐: 使用 Make-My-Manifest 或 Ummm 等工具可以自动生成这些复杂的 XML 文件。
2. 使用 DirectCOM (动态加载)
如果你不想处理复杂的 Manifest 文件,可以使用社区中流行的DirectCOM方案。这通常涉及到一个名为DirectCOM.dll的辅助模块。
核心原理:
通过 API 调用 DLL 内部导出的DllGetClassObject函数,手动获取类工厂并创建对象。
代码示例:
首先,你需要声明相关的 API 或使用现有的 DirectCOM 模块:
VB.Net
' 伪代码示例 Declare Function GetInstance Lib "DirectCOM.dll" (ByVal DLLPath As String, ByVal ClassName As String) As Object Sub Main() Dim obj As Object ' 直接通过路径加载,无需注册 Set obj = GetInstance(App.Path & "\MyComponent.dll", "MyClass") obj.DoSomething End Sub3. 使用脚本宿主 (ActiveXObject 技巧)
在某些简单场景下,可以利用 Microsoft 的RegistrationFree特性结合Microsoft.Windows.ActCtx对象。
VB.Net
Dim actCtx As Object Set actCtx = CreateObject("Microsoft.Windows.ActCtx") actCtx.Manifest = App.Path & "\YourManifest.manifest" Dim obj As Object Set obj = actCtx.CreateObject("YourProject.YourClass")方案对比
| 特性 | Manifest 方案 | DirectCOM / 手动加载 |
| 部署难度 | 较高(需编写 XML) | 较低(直接调用函数) |
| 兼容性 | 极佳(Windows 原生支持) | 依赖第三方 DLL 或复杂 API 声明 |
| IDE 支持 | 开发阶段仍需注册 | 开发阶段即可免注册 |
| 调用方式 | 标准Set x = New Class | 必须通过特定函数获取对象 |