我也遇到过,但是重新建立一个OCX控件,把原来的代码在复制一遍试试。还有好像是在JS里真正的监控了这个方法,FEvents中才不为空。否则也是空!我有一次写一个无窗体的OCX控件,也是自己做了一个方法。但是就是不执行,但是最后发现JS监控事件的时候写错了。你可以检查一下,OCX创建以及JS监控事件的代码。看看有没有什么问题。确实很奇怪,但是跟有窗口和无窗口好像也没什么关第。我在网上也找了很久,也没找到什么原因。后来自己重新创建才搞定!

解决方案 »

  1.   

    我是这样做的,
    1、首先在OCX控件的事件接口中建立了一个回调函数,OnTest(aValue:Integer);
    2、在WEB页面中加载ocx控件:
       <object classid="clsid:E9D9B85E-D066-40DC-8191-DD75778356C1" id="FPInfo" width="0"
                height="0">
            </object>
    3、监控回调函数
       <script language="javascript" event="OnTest(aValue)" for="FPInfo">
              alert(aValue);
        </script>我是这样做的,没有什么问题啊,注意for="FPInfo"中的FPInfo是ocx控件的在页面中的ID!
      

  2.   

    而且用<OBJECT ID="ocxtype" CLASSID="CA4E8358-1056-4EC4-A440-E4FE0C159C36"></OBJECT>
    var myobj=document.getElementById("ocxtype");//方法1

    myobj = new ActiveXObject("Banger_PhoneAssembly.PhoneAssembly")
    这2个得到的对象 注册事件的方法还不一样。
    第一个 可以myobj.attachEvent("OnIncomeTalkEvent",OnIncomeTalk);
    我是用带窗体的工程试的 可以 测试通过了
    第二个 我用的方法是myobj.setEventHandler(new IncomeTalkEventHandler());
    function IncomeTalkEventHandler()
    {

    }
    IncomeTalkEventHandler.prototype.OnIncomeTalkEvent =
    function (ANumber)
    {
      alert("测试事件");
      t3.value=ANumber; 
    }
    出错了 Delphi里面报灾难性故障 Project iexplore.exe raised exception class EOleSysError with message '灾难性故障'.
      

  3.   

    那我要多几个监控的回调函数 要怎么写呢 可以在写几个
    <script language="javascript" event="OnTest(aValue)" for="FPInfo">
       alert(aValue);
     </script>这样?
      

  4.   

    呵呵,又学习到了。你这种方法我还真没用过。
    你可以试试我的方法,在页面中直接就object创建,而不要用NewActiveX。然后面页面中写<script language="javascript" event="OnTest(aValue)" for="FPInfo">
      alert(aValue);
      </script>
    JS函数试试。
      

  5.   

    我调试Delphi FEvents 还是为nil啊
    js代码:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <body>
    <input type="button" id="look" value="Create" onclick="showall()">
    <INPUT TYPE="button" value="拨号" onclick="OnDail()">
    <input name="t2" type="text" id="t2">
    <INPUT TYPE="button" value="挂断" onclick="OnHangUp()">
    <TEXTAREA name="t3" ID="t3"></TEXTAREA>
    <TR><TD>
    <OBJECT ID="ocxtype" CLASSID="C932CEB4-B779-44D8-929C-C9B0CB5D1346"></OBJECT>
    <script language="javascript" event="OnIncomeTalkEvent(ANumber)" for="ocxtype">
       alert(ANumber);
    </script>
    <SCRIPT LANGUAGE="jscript" >
    var myobj;
    function OnDail()
    {
    myobj.PhoneDail(t2.value);
    }
    function OnHangUp()
    {
    myobj.HangUpPhone(t2.value);
    }
    function showall()
    {
    myobj = new ActiveXObject("Banger_PhoneAssembly.PhoneAssembly")

    }
    function IncomeTalkEventHandler()
    {

    }
    IncomeTalkEventHandler.prototype.OnIncomeTalkEvent =
    function (ANumber)
    {
    alert("测试成功,点击事件");
    t3.value=ANumber; 
    }
    </SCRIPT>
    </TD></TR>
    </body>
    </html>
      

  6.   

    你要实在不行,就做个有窗体的,用Object创建时,把长度和宽度设为0试试!
      

  7.   

    function IncomeTalkEventHandler()
    {}
    IncomeTalkEventHandler.prototype.OnIncomeTalkEvent =
    function (ANumber)
    {
    alert("测试成功,点击事件");
    t3.value=ANumber; 
    } 这几个是干什么的?和上面的JS可能是冲突的吧!
      

  8.   

    这个是测试代码 没有调用的
    我发现问题在,带窗体的会执行
    procedure TTestOcx.EventSinkChanged(const EventSink: IUnknown);
    begin
      FEvents := EventSink as ITestOcxEvents;
      inherited EventSinkChanged(EventSink);
    end;
    这个方法
    不带窗体的 不会执行 这是为什么?
    然后js创建对象的方法也不一样 不带窗体的用
    var myobj=document.getElementById("ocxtype");//方法1
    好像没用了,这样就没有了attachEvent方法, 好像也不会走EventSinkChanged这个方法了
      

  9.   

    用new ActiveXObject创建的对象并非一个DOM对象,因此不能调用attachEvent方法。
    而用document.createElement("OBJECT")创建的才是一个DOM对象。
      

  10.   

    我那种方法是可行的。你不行自己在建一个简单的ActiveX控件测试一下,应该 没有问题,我做指纹采集的时候就是这么做的。而且我用过第三方的一个电子签章控件也是这么干的(花钱买的).没发现什么问题!
      

  11.   

    那不调用EventSinkChanged这个方法 就是问题所在了 导致FEvents为nil
    这要如何处理啊
      

  12.   

    2. 动态创建方法
    function onBodyLoad()
    {
            myControl = document.createElement("OBJECT");
            document.body.appendChild(myControl);
            myControl.codeBase = "myControl.cab";
            myControl.classid = "clsid:1ACA02DF-AF52-4371-89B9-B9245BD21831";
            
            myControl.attachEvent("event1", OnEvent1);
    }<body onload="onBodyLoad()"> 
    ...3. 错误的动态创建方法function onBodyLoad()
    {
            myControl = new ActiveXObject(myControl.Test);
            myControl.attachEvent("event1", OnEvent1);
            ~~~~~~~~~~~~~~~~~~此时会报告“无此方法”,这是因为
    用new ActiveXObject创建的对象并非一个DOM对象,因此不能
    调用attachEvent方法。而用document.createElement("OBJECT")
    创建的才是一个DOM对象。
    }试试这种方法!
      

  13.   

    我已经换成这样了
    function test()
    {
    myControl = document.createElement("OBJECT");
       document.body.appendChild(myControl);
       myControl.codeBase = "myControl.cab";
       myControl.classid = "C932CEB4-B779-44D8-929C-C9B0CB5D1346";
         
       myControl.attachEvent("OnIncomeTalkEvent", test1);
    }也还是没有用 不会执行EventSinkChanged FEvents始终为nil
      

  14.   

    唉!真是没招没招的了。你在好好看看代码吧!
    就是这些方法了。要实在没办法,你就从ActiveX控件里直接调用页面中的JS函数吧,这个例子网有很多,你可以搜索一下!
      

  15.   

    没人写过 这样的ocx? 不带窗体的 编译出来的是个dll 能实现js主动调用ocx的方法,也能注册事件,实现方法回调。
      

  16.   

    我没有这样用过。楼主说的方法是可行的。
    DLL肯定是可以跨语言的。
      

  17.   

    你有写过不带窗体的ocx吗 
      

  18.   

    呵呵!还纠结呢!你还是写一个简单的自己测试一下吧,那些方法都是可以的!你不要用原来的代码,直接新建一个工程自己写。WEB页面也是,不要有多余的代码!