网络安全 频道

VFP编程技巧

  • 如何注册ActiveX控件

    •   我曾在“编程心得(三)”中提到:“经常在网上看到因“XXX.OCX
      没有注册,不能运行,怎么办?”这个问题,最近我也陆续开发了一些以
      .OCX为后缀的ActiveX控件,这次我就简要地介绍一下什么是ActiveX控
      件、如何注册ActiveX控件的问题。
        如果我们直接讲OLE控件(Object Link and Enbed 译: 对象链接
      与嵌入)恐怕大家就比较熟悉了,因为在VFP的帮助里常常会看到“OLE”
      这三个字母,而OLE是指在Windows环境下应用程序间信息共享和传送的一
      种技术,其包含的内容非常广泛,OLE控件(.OCX)只不过是OLE庞大技术
      体系中的一种。在VFP中,我们可以简单和笼统地说:ActiveX控件(.OCX)
      就是目前最高版本的OLE控件。
        在这里我并不想详细介绍OLE或ActiveX,而是介绍如何注册ActiveX
      控件和当系统出现“XXX.OCX没有注册”后怎么办的问题。
        1.ActiveX控件一般存放在什么文件夹里:
        要注册ActiveX控件,你首先必须知道ActiveX控件具体的文件名和它
      所在的文件夹。ActiveX控件是以 .OCX为后缀的文件,Windows 95/98操
      作系统一般都把ActiveX控件存放在:系统\System\文件夹中(这也是每个
      应用程序查找ActiveX控件时默认的文件夹),当然根据需要您也可放在其
      他文件夹中,如果是这样,一旦存放ActiveX控件的文件夹名重命名,那您
      就必须重新对该ActiveX控件进行注册,否则就会出现“XXX.OCX没有注册”
      或“找不到XXX.OCX文件”的提示。(这点您将会在下面的介绍中知道原因)
        2.如何注册ActiveX控件:
        所谓注册,就是在系统注册表文件System.dat中建立一个主键,在
      Windows 9X 中,是建立在“HKEY_CLASSES_ROOT\CLSID\”键下的。
        在VFP中注册ActiveX控件一般有以下三种简单的方法:
        A、通过VFP菜单的选择项进行注册: 进入VFP编辑状态,在VFP系统主
      菜单的[工具]-[选项]-[控件]-[ActiveX 控件]-[按添加按钮],选择您要
      注册ActiveX控件的文件夹和文件名,VFP就会自动向系统注册表进行注册,
      注册完后您只需在控件列表框“ActiveX控件名”前的复选择框里打钩,就
      可在表单设计器的[表单控件]-[ActiveX控件]中进行选择使用了。

        B.直接运行Regsvr32.EXE系统文件进行注册,
        可在VFP的程序中执行:Ren Regsvr32 [PATH]\xxx.ocx
      进行注册。

        C.利用Regedit.exe注册表编辑器,在编辑器的查找里直接输入 .OCX
      文件名进行查找,找到:
      “HKEY_CLASSES_ROOT\CLSID\{xxxxxxxxxxxxxxxxxxxxxxxxxxx}”主键
      后,再利用注册表编辑器菜单上-[注册表]-[导出注册表文件]-然后在文件
      选择窗里输入导出的注册表文件名,并在下面的[导出范围]单选框中选[选
      择的分支],最后按[保存],这样您就把该控件在注册表中的主键保存在一
      个 .REG的注册表文件里了。在需要注册该控件的机器上,您只要直接在这
      个 .REG的注册表文件上双击鼠标,系统就会询问您是否要将该.REG文件写
      入本机的System.dat文件中,也就是进行注册。 如果选择“是”,那就进
      行注册了。
        那么我们保存的这个.REG注册表文件里有些什么呢?
        下面是MP3PLAY.OCX在导出的.REG注册表文件中的内容:
      REGEDIT4
      [HKEY_CLASSES_ROOT\CLSID\{3B00B10D-6EF0-11D1-A6AA-0020AFE4DE54}]
      @="Dialog-Medien Mp3Play Control"
      [HKEY_CLASSES_ROOT\CLSID\{3B00B10D-6EF0-11D1-A6AA-0020AFE4DE54}\ProgID]
      @="Mp3Play.Mp3PlayCtrl.1"
      [HKEY_CLASSES_ROOT\CLSID\{3B00B10D-6EF0-11D1-A6AA-0020AFE4DE54}\InprocServer32]
      @="C:\\MP3\\MP3PLAY.OCX"
      "ThreadingModel"="Apartment"
      [HKEY_CLASSES_ROOT\CLSID\{3B00B10D-6EF0-11D1-A6AA-0020AFE4DE54}\ToolboxBitmap32]
      @="C:\\MP3\\MP3PLAY.OCX, 1"
      [HKEY_CLASSES_ROOT\CLSID\{3B00B10D-6EF0-11D1-A6AA-0020AFE4DE54}\MiscStatus]
      @="0"
      [HKEY_CLASSES_ROOT\CLSID\{3B00B10D-6EF0-11D1-A6AA-0020AFE4DE54}\MiscStatus\1]
      @="131473"
      [HKEY_CLASSES_ROOT\CLSID\{3B00B10D-6EF0-11D1-A6AA-0020AFE4DE54}\Control]
      @=""
      [HKEY_CLASSES_ROOT\CLSID\{3B00B10D-6EF0-11D1-A6AA-0020AFE4DE54}\TypeLib]
      @="{3B00B10A-6EF0-11D1-A6AA-0020AFE4DE54}"
      [HKEY_CLASSES_ROOT\CLSID\{3B00B10D-6EF0-11D1-A6AA-0020AFE4DE54}\Version]
      @="1.0"

        我之所以写这些,是为了让您理解ActiveX控件放在“系统\System\”文件
      夹和放在其他文件夹中的区别,我的这个MP3PLAY.OCX是放在C:\MP3\文件夹里的,
      所以上面的红色部分就明确标明了ActiveX控件所在的文件夹,也就是:如果这个
      文件夹被重新命名后,您必须重新进行注册的原因所在。而如果是放在:
      “系统\System\”里,那这些红色的部分就是这样写的了:
      @="MP3PLAY.OCX"
      @="MP3PLAY.OCX, 1"
      可以看出,这里已没有C:\MP3\文件夹名了。

        上面的兰色部分就是一个ActiveX控件是不是在注册表文件里进行注册的标志,
      也就是该控件在注册表文件里的主键名。

        必须注意的是,上面B和C方法的注册,只是在注册表中进行了注册,如果您想
      在VFP编辑时象其他控件那样在表单设计器的[表单控件]-[ActiveX控件]中看见它,
      则您还必须进行方法A中的绿色部分。
    •   希望通过上面这些简单的介绍,当您再遇到“XXX.OCX没有注册,...”时,您
      可以找出原因,自行处理了。

    利用DOS下的内部或外部命令来完成VFP无法达到的功能

    •  这次“心得”继续谈谈编程中的一些小技巧,这些小技巧您可能已经知道,
      但我还是希望这些技巧能对您有所帮助:

        1.利用DOS下的内部或外部命令来完成VFP无法完成的功能:

        A.利用DOS下的ATTRIB.EXE程序来改变文件的属性。我曾介绍过用VFP
      的RENAME命令来更改文件属性的方法,其实用DOS下的ATTRIB.EXE更加方便。
      ATTRIB.EXE程序是DOS操作系统的外部命令之一,在C:\WINDOWS\COMMAND\
      文件夹里,
      用法: RUN /N ATTRIB [+或-] [R S H] 文件名
      比如: RUN /N ATTRIB -R -S -H XXX.DAT
      把XXX.DAT文件的只读、隐含和系统属性去掉,如果把“-”改为“+”,则作
      用相反。

        B.利用DOS的内部命令DIR来取得指定磁盘上所有的文件夹和文件名、 磁
      盘格式化时建立的磁盘卷标序号、文件夹及文件的长文件名和短文件名、文件
      夹和文件的个数等。
      用法: RUN DIR [*或?] [/s /...] > 文件名
      比如想取得C:盘下的所有文件夹和文件,则:
      RUN DIR C:\*.* /S > DISK_C.TXT
      这样就会在当前目录下建立一个名为DISK_C.TXT的文本文件,文件里包含了上
      面提到的所有数据,下面是其中的一部分:

      Volume in drive C has no label
      Volume Serial Number is 3846-11DF
      Directory of C:\

      COMMAND COM   94,282 06-19-98 20:01  COMMAND.COM
      WZT1        25 10-11-99 23:44  WZT1
      WZT2        25 10-11-99 23:44  WZT2
      WINDOWS  < DIR >   05-04-99 20:56  WINDOWS
      ......

              22 file(s) 234,496 bytes
              40 dir(s) 1530,612,224 bytes free

      具体的数据格式这里就不介绍了。

        C.利用DOS的内部命令DATE来改变系统日期
        VFP本身没有办法改变系统的日期或时间,用WIN32 API虽说可以改变,
      但十分复杂(在我的[专题文章]栏目里有介绍),如果用 DOS的内部命令:
      DATE来改变系统日期就比较方便了,方法是:
      RUN DATE [MM/DD/YY]

      比如把系统日期改为2000年10月1日,则
      RUN DATE 10/01/2000

      如果您需用变量来改日期,则:
      mDATE=''10/01/2000''
      RUN DATE &mDATE

      同理,如果想改变时间则用DOS的内部命令TIME来达到。
        类似的命令还有一些,您可自己一试,需要说明的是,利用DOS下的命令,
      会出现DOS窗口,您可以建立个快捷方式,将其设为最小化,使用时调用这个快
      捷方式,可以以最小化窗口来执行DOS的命令。 也许您发现了,利用DOS的内部
      命令时RUN命令后不能带“/N” 。
  • 0
    相关文章