织梦CMS - 轻松建站从此开始!

罗索

当前位置: 主页>杂项技术>VC(MFC)>

如何分发 ActiveX 控件

罗索客 发布于 2002-10-22 11:16 点击:次 
(hangwire发表于2001-12-8 20:44:38) [问题] 你好!有一个问题困绕了我很久,不知道你能不能帮我? 我在一些网页里使用了ACTIVEX控件(如树形控件msctl32.ocx,图表控件mschrt20.ocx),在WIN98下面用regsvr32.exe(或者直接用DllRegServer)注册后,都可以正
TAG:

(hangwire发表于2001-12-8 20:44:38)

[问题]
你好!有一个问题困绕了我很久,不知道你能不能帮我?
  我在一些网页里使用了ACTIVEX控件(如树形控件msctl32.ocx,图表控件mschrt20.ocx),在WIN98下面用regsvr32.exe(或者直接用DllRegServer)注册后,都可以正常显示,但是,在Win2000下(没有安装VC,VB的机器),怎么都不行,查看注册表好象也没有什么区别。
  再试着安装VC中的ActiveX组件后,就可以了,不知道微软是怎么做的。
希望你能帮到我,哪怕是一个建议。

[解答]
ActiveX控件的分发涉及以下几个方面的问题:
1、   ANSI或Unicode控件版本
你必须决定分发的控件是ANSI版本还是Unicode版本,或两个版本都要。这主要是根据这两个版本所固有的可移植性因素来考虑的。ANSI控件在Win32操作系统上运行,在各种Win32操作系统之间允许最大化的可移植性。Unicode控件只能在Windows NT(NT 3.51或以后的版本)上运行,但不能在Windows 9x上运行。如果可移植性是你要关心的主要问题,那么发布ANSI控件,如果你的控件只运行在Windows NT上,那么就发布Unicode版本。你也可以选择发布两个版本,在安装的时候,让你的应用程序针对用户的操作系统进行相应的选择。
2、   安装控件和可分发的DLLs
与ActiveX一起提供的setup程序应该在Windows目录中创建一个专门的子目录将OCX文件方法这个子目录中。可用的方法是在你的setup程序中用Windows的API函数GetWindowsDirectory来获得Windows目录的名字。然后用你公司或产品的名字派生子目录的名字。
Setup程序必须在Windows系统目录中安装必要的可分发DLL,如果用户的机器中已经有了这些DLLs,setup程序应该将它们的版本和你安装的版本进行比较。保证只安装最新的版本。
因为ActiveX控件只能被用于OLE容器应用程序中,所以没有必要分发全套的OLE DLLs。你可以假设容器应用(或操作系统本身)已经安装了标准的OLE DLLs
3、   注册ActiveX 控件
在使用某个控件之前,必须在Windows注册表中注册相应的入口。某些ActiveX控件容器为用户提供了菜单项来注册新控件,但是这些特性在容器中是没有的。因此,你可能要在setup程序中通过安装过程来注册控件。Visual C++中有一个可分发的程序--Regsvr32.exe,你可以用这个程序来注册控件,只要把控件的OCX文件的完整路径和文件名传递给Regsvr32.exe就可以了。另外MFC 的ActiveX控件例子REGSVR提供了Regsvr32.exe的源代码。它示范了实现注册任务的方法,你可以用它作为指导来编写自己的注册例程。
如果你愿意的话,你可以编写自己的setup程序直接注册控件,不使用regsvr32.exe。用LoadLibraryAPI加载控件的DLL。然后用GetProcAddress来获得"DllRegisterServer"函数的地址。最后调用DllRegisterServer函数。下面的代码示范了这种方法,hLib用来存储控件库的句柄,lpDllEntryPoint存储"DllRegisterServer"函数的地址。

HINSTANCE hLib = LoadLibrary(pszDllName);
if (hLib < (HINSTANCE)HINSTANCE_ERROR)
{
DisplayMessage(IDS_LOADLIBFAILED, pszDllName); //无法加载DLL
iReturn = FAIL_LOAD;                   //无法加载DLL
}

// 找到入口点
(FARPROC&)lpDllEntryPoint = GetProcAddress(hLib,
   _T("DllRegisterServer"));
if (lpDllEntryPoint != NULL)
(*lpDllEntryPoint)();
else
   //无法定位入口点
直接注册控件的优点是你不必调用并加载单独的进程(即REGSVR32),从而减少了安装时间。此外,因为注册是一个内部过程,setup程序能比外部过程更好地处理错误和不可预见的情况。
注意:你的setup程序安装ActiveX控件之前,它应该调用OleInitialize。当你的setup程序结束后,调用OleUnitialize。这样可以保证在注册过程中,OLE系统DLLs始终处于正常状态。当你安装和注册某个控件时,如果你的系统是Windows 95,那么还应该注册OLEPRO32.DLL,(如果你的系统是Windows NT4.0或以后的版本,则还应该注册OLEAUT32.DLL)。注册这个DLL的过程和方法与注册OCX文件的过程与方法一样。记住只是在必须安装OLEPRO32.DLL 或 OLEAUT32.DLL时进行这个注册步骤。如果这个DLL已经安装,则你应该假设它已经被注册。
如果你的控件使用库存属性页,则你还应该注册MFCx0.DLL。不像OLEPRO32.DLL 或 OLEAUT32.DLL的注册时可选的,MFCx0.DLL的注册始终是必需的,即便他已经被安装。
4、   要分发的文件清单
下面列出的是你要与ActiveX控件一起分发的文件清单。分发这些文件的条款在工程的许可协议中表述。Visual C++的安装程序会根据你的安装选项在你的开发机上安装这些文件。当你分发这些文件时,将它们从Visual C++的CD拷贝到分发媒介中。从而保证你分发的是正确的文件版本。下表列出了必须与ActiveX控件一起分发的文件清单。
可分发文件清单:
文件 描述
MFCx0.DLL MFC DLL (ANSI)
MFCx0U.DLL MFC DLL (Unicode)
MSVCRTx0.DLL C 运行时库
OLEPRO32.DLL (或OLEAUT32.DLL)  属性框架和标准类型支持,Windows NT 4.0 和以后版本,使用OLEAUT32.DLL
REGSVR32.EXE 控件注册实用程序

(hangwire)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/200210/639.html]
本文出处: 作者:hangwire
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容