(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) |