dll封装成ocx控件,请确保为有效的dll或ocx
ActiveX,OLE是基于COM的应用,文件后缀通常以dll和ocx结尾;ocx作为一个特殊的dll文件,有一定的用户界面和事件响应,而dll文件只是方法和属性的集合。
1.动态链接库简介
DLL,动态链接库的缩写,是一组包含函数和数据的模块,可以被其他应用程序共享。DLL作为共享函数库的可执行文件,封装了一个或多个编译链接的函数。多个进程可以同时使用一个DLL,并在内存中共享该DLL的副本。dll也有助于共享数据和资源。它非常类似于可执行文件(。exe文件)。两者的区别在于,DLL虽然包含可执行代码,但不能单独执行,只能由需要使用它的应用程序直接或间接调整。[1]
一般来说,在Windows操作系统中,很多应用程序并不是完整的可执行文件,其正确执行需要调用一些相对独立的动态链接库,即DLL文件。一个应用程序可以调用多个DLL文件,一个DLL文件可以由几个应用程序共享。这种DLL文件称为共享DLL文件。[2]DLL文件一般存储在C:WindowsSystem目录下,也可能放在应用程序所在的目录或子目录下。
说到动态链接,先解释一下静态链接。什么是静态连接?在程序链接的过程中,需要将编译好的二进制代码链接成目标代码。链接器从静态链接库中获取所有被引用的函数,并将这些被引用的函数与代码一起放入可执行文件中。那么dll的静态连接就是链接器把引用的库函数的代码复制到可执行模块(。DLL文件或。exe文件)。
什么是动态链接?动态链接意味着系统允许可执行模块(。dll文件或。exe文件)来运行,并且只需要定位DLL函数的可执行代码所需的信息。换句话说,可执行模块(。dll文件或。exe文件)在运行时加载这些模块(即所需模块映射到调用进程的地址空间)。[3]
那么动态链接相比静态链接有什么优势呢?
(1)节省内存,减少交换操作。使用动态链接,多个进程可以同时使用一个DLL,并在内存中共享该DLL的副本。使用静态链接,每个应用程序都包含被引用库函数的代码,因此Windows必须为每个应用程序在内存中加载被引用库函数的代码副本。
(2)节省磁盘空间。使用动态链接,磁盘上只需要DLL的一个副本。使用静态链接,每个应用程序都包含被引用的库函数的代码。
(3)更容易升级。使用动态链接,当DLL中的函数改变时,只要函数的参数和返回值不变,就不需要重新编译或重新链接使用它们的应用程序。使用静态链接,当函数改变时,需要重新链接来构建应用程序。
(4)支持多语言程序。用不同编程语言编写的程序可以调用同一个DLL函数,只要程序遵循函数的调用约定。
(5)提供扩展MFC库类的机制。您可以从现有的MFC类中派生类,并将它们放入MFC应用程序的MFC扩展DLL中。
(6)支持多语言程序,轻松完成国际版本的创建。通过将资源放入DLL来创建应用程序的国际版本要容易得多。将可用于应用程序每种语言版本的字符串放入单独的DLL资源文件中,并使不同语言版本加载适当的资源。[4]
DLL包含以下两种类型函数的定义:
导出函数:这些函数由可执行模块调用。dll文件或。exe文件)。
内部函数:这些函数只能从定义它们的DLL中调用。DLL也导出数据。但是,这些数据由相应的函数使用。
您可以通过以下方式调用DLL中的函数:
加载时动态链接:可执行模块执行显式调用导出DLL函数。为DLL创建一个导入库,然后将DLL链接到应用程序。加载应用程序时,导入库提供加载DLL和查找导出的DLL函数所需的信息。
运行时动态链接:运行时加载DLL时,可执行模块使用LoadLibrary函数或LoadLibraryEx函数。可执行模块调用GetProcAddress函数获取导出的DLL函数的地址。链接时,Windows会搜索一组预安装的dll,如性能库(Kernel32.dll)和安全库(User32.dll)。然后,Windows按以下顺序搜索dll:
1.当前进程的可执行文件所在的目录。
2.当前目录。
3.Windows系统目录。(GetSystemDirectory函数获取Windows系统目录的路径。)
4.Windows目录。(GetWindowsDirectory函数获取Windows目录的路径。)
5.5中列出的目录。PATH环境变量。注意:LIBPATH环境变量不用于搜索。[3]
DLL有一个特殊的入口点(DllMain函数),它在附加和分离进程和线程时运行。这种行为允许根据需要创建和销毁数据结构。带有文件扩展名的文件类型。ocx,cpl和。drv也是dll,尽管文件扩展名已经更改。
您可以通过创建dll来达到以下目的:
(1)将程序分成可以按需加载的独立模块。
(2)存储特定语言或特定区域的资源。
(3)使您自己的应用程序能够使用核心代码库。
(4)生成进程内COM对象或ActiveX控件(OCX)。
(5)使用OLE对象作为进程内dll。这种用法可以提高OLE链接的性能。
(6)使用控制面板扩展或使用某些类型的驱动程序。[3]
第二,关于ActiveX控件与。ocx后缀
就像刚才说的,带文件扩展名的文件类型。ocx,cpl和。drv也是dll。
今天的ActiveX控件相当于以前的OLE控件或OCX。典型的控件包括设计时和运行时用户界面。唯一的IDispatch接口定义控件的属性和方法,唯一的IConnectionPoint接口定义控件可以引发的事件。控件可以在容器中运行,所以从运行的角度来看,它类似于DLL。[5]
虽然ActiveX和OLE都是基于组件对象模型(COM)的,但是它们为程序员提供了完全不同的服务。COM提供了一种底层的对象绑定机制,支持对象之间的交互通信。使用OLE COM提供底层应用服务,如连接和嵌入机制,支持用户创建复合文档。另一方面,ActiveX提供了更精细的结构来支持在网站中嵌入控件和对事件的交互式响应。ActiveX经过优化以提高时间和空间效率,而OLE经过优化以方便最终用户的使用和桌面应用程序的集成。ActiveX也给互联网技术带来了一些技术变革。比如ActiveX大大减少了代码量(代码量减少了50%到70%),支持更多的提交和异步连接。[6]
ActiveX是基于OLE和COM的,但是COM模型中很多令人费解的技术细节都可以被MS的各种开发工具屏蔽掉,ActiveX技术包括以下几个方面:(1)自动化服务器(2)自动化控制器(3)控件(4)COM对象(5)文档(6)容器。
ActiveX控件。ocx后缀主要用于WEB和窗口窗体程序的开发中。应用程序使用ActiveX/COM组件来扩展自己的业务逻辑、事务处理和应用程序服务的范围。
顺便问一下,如何注册和卸载ActiveX控件。ocx后缀,在开始菜单的“运行”中输入以下代码来完成任务:
Regr32path xxx.ocx 注册
卸载regsvr32 /u path xxx.ocx
其中path表示xxx.ocx所在目录的路径。
三、OCX和DLL的区别
ActiveX控件。ocx后缀是一个特殊的DLL,它基于OLE和COM。它是一个具有交互界面的可视化控件。它定义控件的属性和方法,以及控件可以触发的事件的响应。我们通常说带有。DLL后缀是一组包含函数和数据的模块,可以被其他应用程序共享。