注册了吗
 regsvr32 *.ocx

解决方案 »

  1.   

    Project->Web Deployment Options...中选择OCX路径。
      

  2.   

    Project->Web Deployment Options中的项目都设置了,还是不行
      

  3.   

    这种问题90%是路径有问题。
    可以分两大类:
    一、发布时问题:
    根据发布时的选项不同,发布的文件也不一样,如果发布时选择使用CAB文件,包含版本信息,则会有三个东东,ActiveFormProj1.cab,ctiveFormProj1.HTML,ActiveFormProj1.INF
    其中ActiveFormProj1.cab中有OCX,ctiveFormProj1.HTML为测试页,ActiveFormProj1.INF
    安装文件,在测试页中,有一段代码codebase="./ActiveFormProj1.cab#version=1,0,2,0"
    指明当前要安装的ActiveFormProj1.cab位置,这里是‘.’,表示ActiveFormProj1.cab与其他两个文件在同级目录下。可以在Project->Web Deployment Option的Target URL中设置。如果你在其他目录里的页面使用了该OCX,则务必保证codebase中的路径的正确性。如果路径不正确,则第一次使用OCX时,因为OC CACHE中没有该OCX文件,所以IE会去根据codebase寻找安装文件,如果路径不对,自然安装不成功。如果OC CACHE中已存在该OCX文件,并且版本号没有更新,则IE不会重新下在安装该OCX文件。IE会使用OC CACHE中的已注册过的该OCX文件。(OC CACHE指C:\WINDOWS\Downloaded Program Files等目录)
    二、运行时问题:
    根据我的体会,先讲一下OCX的装载过程。因为OCX是一种DLL,同时有是进程内服务器。所以需要宿主程序加载,通常IE作为宿主程序。以IE为例(第一次安装时例外),当使用IE打开页面里有OBJECT标记的页面时,IE遇到这样的标记,会根据CLSID到本地注册表里寻找该OCX的信息,注册表中的信息包含说明该OCX是进程内服务器,加载路径等信息,通常情况下,加载路径为OC CACHE(但也有列外,比如使用DELPHI的RUN-》REGISTER ACTIVEX,你看一下该路径变成了当前OCX编译输出的路径)。这样的话,IE加载OCX文件就会有两种可能的
    加载路径,这是引起很多问题的原因所在。比如,你发布ACTIVEX后,忘记更新codebase中
    的版本信息,那么IE不会更新OC CACHE中的OCX,IE仍会使用老的OCX,此时你就会奇怪,我新加的特性怎么没有在页面中表现出来,这时,解决办法有两个,其一,更新codebase中的版本信息与发布版本信息一致(注意是一致,而不是高与当前版本,因为我发现当版本增加到一定程度后,如100,又会开始减少,即下次发布版本不是101,反而是99)。其二,干脆删掉OC CACHE中的OCX,有时系统会提示无法删除当前OCX,需要重起机器的信息,此时你可以尝试关掉所有的IE,在去删除OCX,如果还不行,可以结束当前EXPLORER(因为EXPLORER与IEXPLORER是捆绑在一起的),然后肯定可以删掉该OCX,当前重起后,在不打开引用该OCX页面的情况下页可以删除该OCX。然后,重新利用IE安装OCX即可。
    IE在第一次安装OCX时,做了如下几件事(前提是发布选项如我上述)
    1、根据CODEBASE找到安装文件。如果找不到,则会出现你上述的问题。
    2、下在INF到本地缓存中。
    3、根据INF文件找到CAB文件。
    4、下载CAB文件到本地缓存中。
    5、解压出OCX文件到OC CACHE中。
    6、更新注册表中的相关信息。
    7、页面中载入该OCX并初始化。
    8、执行页面的ONLOAD脚本函数。(一般可以在该函数中对控件的外观等属性做一些设置)。
    以上任何一步出问题,OCX都不会成功装载。其中6有时会出问题。即,以前安装过该OCX控件,并使用DELPHI的REGISTER ACTIVEX注册过,那么IE在注册时有时会又问题,具体我还不是太确定。
    以上是我做ACITVEX控件时的一点心得,写出来供大家参考,由于本人水平有限,错误在所难免,欢迎大家指正,同时也欢迎大家就ACTIVEX的开发进行讨论。