2017-10-19 162 views
0

我遇到了Delphi ActiveX控件问题。我创建一个ActiveX库,然后创建一个ActiveX窗体。我定义了一个函数,我想从JavaScript调用这个函数。但我不能。 JavaScript引发错误:“对象不支持属性或方法'Method1'”。无法从JavaScript调用Delphi ActiveX方法

这是HTML代码:

<OBJECT id="GetDocsActiveX" classid="clsid:A03962E6-6030-46C0-988D-ADE26BC4BACD" codebase="GetDocs.ocx#version=1.0"> 
    <PARAM NAME="Color" VALUE="13417386"> 
</OBJECT> 

这是Delphi代码* .ridl文件

interface IGetDocs: IDispatch 
{ 
    [id(0x000000E8)] 
    HRESULT _stdcall Method1(void); 
}; 

这是* _TLB.pas文件

IGetDocs = interface(IDispatch) 
    ['{8F2BF1C6-98A5-4D6B-A43E-890698A3C91D}'] 
    procedure Method1; safecall; 
end; 

,这是带执行文件

unit GetDocsU; 
{$WARN SYMBOL_PLATFORM OFF} 
interface 
uses 
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
    ActiveX, AxCtrls, GetDocs_TLB, StdVcl, Vcl.StdCtrls, ShellApi, Vcl.XPMan, 
    IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP; 

type 
    TGetDocs = class(TActiveForm, IGetDocs)  
protected  
    procedure Method1; safecall; 
public 
    { Public declarations } 
    procedure Initialize; override; 
end; 

implementation 

uses ComObj, ComServ; 
{$R *.DFM} 
procedure TGetDocs.Method1; 

begin  
     MessageDlg('HI from active x', mtInformation, [mbOK], 0, mbOK); 
end; 

end. 

任何人都可以帮助解决这个问题。我试图在公开部分的公开部分中移动方法而没有成功。

编辑 这里是Java脚本

<script type="text/javascript"> 
try { 
     var obj = $("#GetDocsActiveX"); 
     if (obj) { 
      obj.Method1(); 
     } else { 
      alert("Object is not created!"); 
     } 
    } catch (ex) { 
     alert("Some error happens, error message is: " + ex.message); 
    } 
</script> 
+0

您是否检查过可以使用'GetOleObject'或'GetComObject'从独立的Delphi应用程序激活ActiveX对象?顺便说一句,读者不能从你发布的内容中知道你的j'script是否使用了正确的clsid。 – MartynA

+0

我用regsvr32注册Activex并得到相同的错误。 – plamen

回答

1

我注意到,至少这一个错误:

var obj = $("#GetDocsActiveX"); 

这看起来像一条线的jQuery(或类似的库)来获取与元素id'GetDocsActiveX'。但jQuery不直接返回元素。它返回一个包装元素集合的jQuery对象。您尝试调用该jQuery对象的方法,而不是您正在查找的实际元素。

有办法解开从jQuery集合的元素,但我觉得它更容易使用普通的JavaScript只得到对象:

var obj = document.getElementById("GetDocsActiveX"); 

,或者如果你喜欢和选择的工作:

var obj = document.querySelector("#GetDocsActiveX"); 
+0

现在的工作非常感谢你的建议。在这种情况下我不应该使用jquery,但我不知道它。我认为document.getElementById(“GetDocsActiveX”);和var obj = $(“#GetDocsActiveX”);给出相同的结果,但我错了。再次感谢你。 – plamen

+0

不客气!使用jQuery确实是一个很容易犯的错误。如果你喜欢,请阅读并跟进[当某人回答我的问题时该怎么办?](https://stackoverflow.com/help/someone-answers) – GolezTrol