`
alibabamon
  • 浏览: 7633 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

关于activex控件如何注册的问题

阅读更多
ActiveX控件注册的几种方法

----本文中的程序原为VC++所编写,老妖略改动一些,将程序用C++Builder编写。

-----ActiveX控件是一个动态链接库,是作为基于COM服务器进行操作的,并且可以嵌入在包容器宿主应用程序中,ActiveX控件的前身就是OLE控件。由于ActiveX控件与开发平台无关,因此,在一种编程语言上开发的ActiveX控件可以无须作任何修改,即可在另一种编程语言中使用,其效果如同使用Windows通用控件一样。如:在VC++中开发的ActiveX控件,不作任何修改即可应用于VB中。由此可见,通过使用ActiveX控件即可实现快速小型的组件重用、代码共享,从而提高编程效率。

----从Internet下载的ActiveX控件,或从其他途径得到的ActiveX控件,用户应该怎样做才能正确使用呢?一般来说,一个外来ActiveX控件要在Windows中被正确使用,首先必须将控件文件(*.OCX)复制到硬盘中,然后将其在Windows中注册,未在Windows中注册过的ActiveX控件是不能使用的。注册ActiveX控件一般来说有三种途径,适用范围不同,各有各的优点,下面分别讨论。

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

----对于未注册过的ActiveX控件可使用此软件对其进行注册,外来ActiveX控件要应用到自己的程序中也必须进行注册。该文件位于Windows目录的system子目录下。使用方法如下:点击“开始”→“运行”;在运行对话框中输入以下命令:
regsvr32 <文件名>      注册一个ActiveX控件
regsvr32 /u <文件名>   解除某ActiveX控件的注册

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

二、使用安装程序
制作软件:InstallShield

----使用regsvr32.exe来注册ActiveX控件虽然简单,但需要用户手工注册,在不用时还得手工解除注册,因此,这对一个应用程序来说并非好的解决方案。大型应用软件一般都有一个安装程序,在安装程序中解决ActiveX控件注册是较为理想的一种方案。使用InstallShield可以制作出专业级的Setup,还可注册其中的ActiveX控件;而且,在以后携载软件时,自动注销掉以前注册的ActiveX控件。方法如下:
启动InstallShield,使用ProjectWizard建立一个新的项目;
新建一个“FileGroup”,将需要注册的ActiveX控件文件放入此“FileGroup”中;
将上述“FileGroup”的“Self-Registered”属性设置成“Yes”。
----上述步骤仅为制作Setup中设置自动注册ActiveX控件几步,至于使用InstallShield怎样制作一个完整的Setup不在本文讨论范围之中,请读者自己参看有关书籍。

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

----对于小型程序不宜采取第二种方法,较好的方法是在程序中嵌入注册代码,实现应用程序自注册。其编程方法是:
使用WindowsAPI函数LoadLibrary载入ActiveX控件;
使用GetProcAddress函数获取ActiveX控件中注册函数DllRegisterServer(注销函数为DllUnregisterServer)指针;
调用注册函数DllRegisterServer(或注销函数DllUnregisterServer)。

----下面以C++ Builder 6.0编写的RegActivex程序为例,介绍怎样在程序中自动注册(注销)ActiveX控件。
在Form中添加两个Button,属性设置如:
Button1->Caption="注册ActiveX控件";
Button2->Caption="注销ActiveX控件";
当Button1时,将对指定控件进行注册;当点击Button2时,将解除指定控件的注册。

双击Button1,添加代码如下:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
HINSTANCE hLib=LoadLibrary("F:\c.ocx");//指定要注册的ocx文件的路径及文件名。
if (hLib==NULL)
  {
  MessageBox(Handle,"不能载入Dll文件!","失败ing..",MB_OK);
  return;
  }

//获取注册函数DllRegisterServer地址
FARPROC lpDllEntryPoint;
lpDllEntryPoint = GetProcAddress(hLib,"DllRegisterServer");

//调用注册函数DllRegisterServer
if(lpDllEntryPoint!=NULL)
  {
  if(FAILED((*lpDllEntryPoint)()))
    {
    MessageBox(Handle,"调用DllRegisterServer失败!","失败ing..",MB_OK);
    FreeLibrary(hLib);
    return;
    };
  MessageBox(Handle,"注册成功!","Reg",MB_OK);
  }
else
MessageBox(Handle,"调用DllRegisterServer失败!","失败ing..",MB_OK);
}


双击Button2,添加代码如下:

void __fastcall TForm1::Button2Click(TObject *Sender)
{
HINSTANCE hLib=LoadLibrary("F:\c.ocx");
if (hLib==NULL)
   {
  MessageBox(Handle,"不能载入Dll文件!","失败ing..",MB_OK);
  return;
  }

//获取注册函数DllRegisterServer地址
FARPROC lpDllEntryPoint;
lpDllEntryPoint = GetProcAddress(hLib,"DllUnregisterServer");//注意这里是DllUnregisterServer,老妖著。

//调用注册函数DllRegisterServer
if(lpDllEntryPoint!=NULL)
  {
  if(((*lpDllEntryPoint)()))
    {
    MessageBox(Handle,"调用DllUnRegisterServer失败!","失败ing..",MB_OK);
    FreeLibrary(hLib);
    return;
    };
  MessageBox(Handle,"注销成功!","Unreg",MB_OK);
  }
else
MessageBox(Handle,"调用DllUnRegisterServer失败!!!","结果",MB_OK);
}


编译联接上述程序,即可得一个可执行文件。另需注意的是:应将ActiveX控件文件复制到Windows的system目录下。

读者可自行找一个ocx文件来注册测试一下的说。
suziwen (资深程序员) 2010-03-20
打CAB包等



ACTIVEX控件与安全
网页中调用ocx,并部署在服务器使用 ocx注册;

调用ocx的网页在本地打开可以成功调用ocx;

把网页部署在服务器上,通过客户端打开,不能成功调用ocx,报“对象不能使用属性或方法”,

个人猜测:由于ocx没有数字签名,故无法通过IE验证,

解决方法:在客户端设置服务器网址为可信任站点,同时将可信任站点的安全级别设置为最低,打开网页,成功调用ocx
然后有时候还需要对IE上的Internet安全里面的四个选项的ACTIVEX相关的选项选为启动即可。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics