2017-10-19 152 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