MFC ActiveX 控件:分发 ActiveX 控件

本文讨论与可再发行 ActiveX 控件相关的几个问题:

重要

ActiveX 是旧技术,不应用于新开发。 有关取代 ActiveX 的新式技术的详细信息,请参阅 ActiveX 控件

ANSI 或 Unicode 控件版本

必须决定是交付 ANSI 或 Unicode 版本控件中的一种,还是两者都交付。 此决定基于 ANSI 和 Unicode 字符集固有的可移植性因素。

ANSI 控件适用于所有 Win32 操作系统,允许在各种 Win32 操作系统之间实现最大的可移植性。 Unicode 控件仅适用于 Windows NT(3.51 或更高版本),但不适用于 Windows 95 或 Windows 98。 如果可移植性是你最关心的问题,请交付 ANSI 控件。 如果控件将只在 Windows NT 上运行,可交付 Unicode 控件。 还可以选择同时交付这两种版本,并让应用程序安装最适合用户操作系统的版本。

安装 ActiveX 控件和可再发行 DLL

随 ActiveX 控件提供的安装程序应创建 Windows 目录的特殊子目录,并在其中安装控件的 .OCX 文件。

注意

使用安装程序中的 Windows GetWindowsDirectory API 获取 Windows 目录的名称。 你可能希望从公司或产品的名称派生子目录名称。

安装程序必须在 Windows 系统目录中安装必要的可再发行 DLL 文件。 如果用户的计算机上已经存在任何 DLL,安装程序应该将它们的版本与正在安装的版本进行比较。 仅当文件的版本号高于已安装的文件时,才重新安装文件。

因为 ActiveX 控件只能在 OLE 容器应用程序中使用,所以不需要将完整的 OLE DLL 集与控件一起发行。 可以假设包含的应用程序(或操作系统本身)安装了标准 OLE DLL。

注册控件

在可以使用控件之前,必须在 Windows 注册数据库中为其创建适当的条目。 一些 ActiveX 控件容器提供了一个菜单项供用户注册新控件,但此功能可能并非在所有容器中都可用。 因此,你可能希望安装程序在安装时注册这些控件。

如果愿意,可以编写安装程序来直接注册控件。

使用 LoadLibrary Windows API 加载控件 DLL。 接下来,使用 GetProcAddress 获取“DllRegisterServer”函数的地址。 最后,调用 DllRegisterServer 函数。 以下代码示例演示了一种可能的方法,其中 hLib 存储控件库的句柄,而 lpDllEntryPoint 存储“DllRegisterServer”函数的地址。

HINSTANCE hLib = LoadLibrary(pszDllName);

if (hLib < (HINSTANCE)HINSTANCE_ERROR)
{
   AfxMessageBox(IDS_LOADLIBFAILED); //unable to load DLL
   iReturn = FAIL_LOAD;              //unable to load DLL
}

// Find the entry point.
lpDllEntryPoint = GetProcAddress(hLib, "DllRegisterServer");
if (lpDllEntryPoint != NULL)
(*lpDllEntryPoint)();
else
;// Unable to locate entry point

直接注册控件的好处是不需要调用和加载单独的进程(即 REGSVR32),可减少安装时间。 此外,由于注册是一个内部进程,因此安装程序可以比外部进程更好地处理错误和不可预见的情况。

注意

在安装程序安装 ActiveX 控件之前,应调用 OleInitialize。 安装程序完成后,调用 OleUnitialize。 这可确保 OLE 系统 DLL 处于注册 ActiveX 控件的正确状态。

应注册 MFCx0.DLL。

另请参阅

MFC ActiveX 控件