S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

如何实现ocx控件的注册

Posted on 2009-09-03 22:05 S.l.e!ep.¢% 阅读(1099) 评论(0)  编辑 收藏 引用 所属分类: InstallShield
为了扩展应用程序的功能,许多系统都使用了或多或少的activex控件,这些控件必须在系统中注册后才能够使用。所以分发powerbuilder应用程序时,必须将系统所使用到的这些activex控件一起分发到用户所使用的计算机上,并且注册它们,只有这样系统才能继续使用这些控件。

  本文将提供三种实现方案,供读者选择使用。


  方法一:在installshield中使用程序对控件进行注册


  installshield提供了一套编程语言,语法规则与c++语言非常类似,使用很容易掌握。选中“scripts”页,你就可以看到安装程序实际执行的源代码,通过添加代码可以实现许多功能。要注册控件必须先将控件所需文件拷贝到目标计算机上,所以必须选择适当的位置添加注册语句。setupregistry()函数就是在文件复制完毕后进行系统注册的地方,所以在这里注册控件最合适。

  function setupregistry()

   number nrootkey, nresult;

   string szprogram, szcmdline, szmsg;

   string szhkey;

   string szkey, szclass, sznumname, sznumvalue;

  begin

   nresult = createregistryset( ″″ );

  //注册程序中用到的ocx控件

  szprogram = ″regsvr32 /s″;

  //假设我们将myocx.ocx文件复制到〈commonfiles〉\my shared下

  szcmdline = commonfiles^″\\my shared\\myocx.ocx″;

  //给执行文件路径加上
引号

  longpathtoquote (szcmdline, true);

  //执行生成的命令:例如regsvr32 /s ″c:\ program files\common files\my shared″。

   if (
launchappandwait(szprogram, szcmdline, wait) 〈 0) then

   messagebox(″myanimatex 控件注册失败!″, severe);

  endif;

  return nresult;

  end;


  方法二:用注册表的方法实现


  大家知道,一般安装程序结束后,为了使系统可以运行,经常需要重新启动计算机,这是由于安装程序修改了注册表或者一些系统文件(autoexec.bat等),必须重新启动才能生效。注册表中有这样一个主键,专门用于存放一些只运行一次的程序,存放在这里的一些执行命令只是在windows系统启动时运行一次,之后便被清空,所以取名为runonce:


  hkey—local—machine\software\microsoft\windows\currentversion\runonce,所以我们可以在installshield中的注册表编辑器中在该主键下添加要执行的代码,来完成控件的注册,如上图所示。

  注意,此方法必须保证安装程序弹出“是否重新启动计算机”的对话框,这样才能保证用户知道必须重启后才能正常使用本系统。


  方法三:在pb程序中实现


  安装程序只需负责将ocx拷贝到相应路径下,pb程序必须可以得到这个路径,建议拷贝到windows系统目录或者与执行文件同目录下。

  具体代码:

  //首先定义api函数,如果ocx控件在与执行文件同目录下,使用getcurrentdirectory函数;如果ocx控件放在系统目录下,使用getsystemdirectory函数。

  function ulong getcurrentdirectory(ulong nbufferlength,ref string lpbuffer) library ″kernel32.dll″ alias for ″getcurrentdirectorya″

  function uint getsystemdirectory(ref string lpbuffer,uint usize) library ″kernel32.dll″ alias for ″getsystemdirectorya″

  //在pb应用(application)的open事件,假设ocx控件在windows系统目录下。

  string ls—pathname,ls—command

  ulong ll—requiredbuffersize

  ls—pathname = space(255)

  ll—requiredbuffersize = getsystemdirectory(ls—pathname,255)

  

  if ll—requiredbuffersize=0 or ll—requiredbuffersize〉255 then

  //报错信息

  else

  ls—command = ″regsvr32 /s ″ + ″~″″ + ls—pathname + ″\myocx.ocx″ + ″~″″

   run (ls—command)

  …

  end if

  regsvr32后面的“/s”执行参数是为了隐藏注册成功消息框。



只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理