ActiveX控件注册的几种方法

  • ActiveX控件是一个动 态连接库,是做为基于COM服务器进行操做的,而且能够嵌入在包容器宿主应用程序中,ActiveX控件的前身就是OLE控件。因为ActiveX控件与 开发平台无关,所以,在一种编程语言上开发的ActiveX控件能够无须做任何修改,便可在另外一种编程语言中使用,其效果如同使用Windows通用控件 同样。如:在VC++中开发的ActiveX控件,不做任何修改便可应用于VB中。因而可知,经过使用ActiveX控件便可实现快速小型的组件重用、代 码共享,从而提升编程效率。
  • 从Internet下载的ActiveX控件,或从其余途径获得的ActiveX控件,用户应该怎样 作才能正确使用呢?通常来讲,一个外来ActiveX控件要在Windows中被正确使用,首先必须将控件文件(*.OCX)复制到硬盘中,而后将其在 Windows中注册,未在Windows中注册过的ActiveX控件是不能使用的。注册ActiveX控件通常来讲有三种途径,适用范围不一样,各有各的优势,下面分别讨论。

1、使用Regsvr32.exe程序对ActiveX控件进行注册

  • 对于未注册过的ActiveX控件可以使用此软件对其进行注册,外来ActiveX控件要应用到本身的程序中也必须进行注册。该文件位于Windows目录的system子目录下。使用方法以下:点击“开始”→“运行”;在运行对话框中输入如下命令:

regsvr32 /s <文件名> 注册一个ActiveX控件且无论注册成功与否,均不显示提示框
regsvr32 /u <文件名> 解除某ActiveX控件的注册编程

  • 咱们使用一些带ActiveX控件的应用程序时,有时会出现不能运行的状况,这有多是其自带ActiveX控件未注册所至,这时不妨使用上述命令一试。

2、使用安装程序注册

  • 使用regsvr32.exe来注册ActiveX控件虽然简单,但须要用户手工注册,在不用时还得手工解除注册,所以,这对一个应用程序来讲并不是好的解决方案。大型应用软件通常都有一个安装程序,在安装程序中解决ActiveX控件注册是较为理想的一种方案。使用InstallShield能够制做出专业级的Setup,还可注册其中的ActiveX控件;并且,在之后携载软件时,自动注销掉之前注册的ActiveX控件。方法以下:

启动InstallShield,使用ProjectWizard创建一个新的项目;
新建一个“FileGroup”,将须要注册的ActiveX控件文件放入此“FileGroup”中;
将上述“FileGroup”的“Self-Registered”属性设置成“Yes”。服务器

  • 在NSIS中有命令能够注册DLL、OCX等文件,代码如:
regdll "$instdir\xxx.dll"
unregdll "$instdir\xxx.dll" (反注册)

3、在应用程序中加入注册代码

  • 对于小型程序不宜采起第二种方法,较好的方法是在程序中嵌入注册代码,实现应用程序自注册。其编程方法是:

使用WindowsAPI函数LoadLibrary载入ActiveX控件;
使用GetProcAddress函数获取ActiveX控件中注册函数DllRegisterServer(注销函数为DllUnregisterServer)指针;
调用注册函数DllRegisterServer(或注销函数DllUnregisterServer)。编程语言

BOOL RegisterOCX(LPCTSTR OcxFileName)
{
    LPCTSTR pszDllName = OcxFileName ; //ActiveX控件的路径及文件名
    HINSTANCE hLib = LoadLibrary(pszDllName); //装载ActiveX控件
    if (hLib < (HINSTANCE)HINSTANCE_ERROR)
    {
        return FALSE ;
    }
    FARPROC lpDllEntryPoint;
    lpDllEntryPoint = GetProcAddress(hLib,("DllRegisterServer")); //获取注册函数DllRegisterServer地址
    if(lpDllEntryPoint!=NULL) //调用注册函数DllRegisterServer
    {
        if(FAILED((*lpDllEntryPoint)()))
        {
            DWORD dwError = GetLastError();
            FreeLibrary(hLib);
            return FALSE ;
        }
        return TRUE ;
    }
    else
        return FALSE ;
}