2017-10-19 52 views
0

J'ai un problème avec un contrôle Delphi ActiveX. Je crée une bibliothèque ActiveX, puis un formulaire ActiveX. Je définis une fonction et je veux appeler cette fonction de JavaScript. Mais je ne peux pas. JavaScript génère une erreur: "L'objet ne prend pas en charge la propriété ou la méthode" Method1 "".Impossible d'appeler la méthode Delphi ActiveX à partir de JavaScript

Voici le code HTML:

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

Ceci est le code Delphi * .ridl fichier

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

c'est * fichier _TLB.pas

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

et c'est fichier avec implémentation

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. 

Quelqu'un peut-il aider avec ce problème. J'essaie de déplacer la méthode dans la section publique de la section publiée sans succès.

EDIT ici est script 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

Avez-vous vérifié que vous pouvez activer l'objet ActiveX à partir d'une application Delphi autonome en utilisant 'GetOleObject' ou' GetComObject'? Au fait, les lecteurs ne peuvent pas dire d'après ce que vous avez posté si votre script utilise le bon identifiant. – MartynA

+0

J'enregistre Activex avec regsvr32 et obtiens la même erreur. – plamen

Répondre

1

J'ai remarqué au moins celui-ci erreur:

var obj = $("#GetDocsActiveX"); 

qui ressemble à une ligne de jQuery (ou d'une bibliothèque similaire) pour obtenir l'élément avec la id 'GetDocsActiveX'. Mais jQuery ne retourne pas l'élément directement. Il renvoie un objet jQuery qui enveloppe une collection d'éléments. Vous essayez d'appeler la méthode de cet objet jQuery au lieu de l'élément réel que vous recherchez.

Il existe des moyens de démêler cet élément de la collection jQuery, mais je pense qu'il est plus facile d'obtenir juste l'objet en utilisant JavaScript simple:

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

ou si vous aimez travailler avec sélecteurs:

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

Ça marche maintenant, merci beaucoup pour vos conseils. Je ne devrais pas utiliser jquery dans ce cas mais je ne le savais pas. Je pense que document.getElementById ("GetDocsActiveX"); et var obj = $ ("# GetDocsActiveX"); donne le même résultat mais j'avais tort. Merci encore. – plamen

+0

De rien! C'est en effet une erreur facile à faire avec jQuery. Si vous le souhaitez, veuillez lire et suivre [Que dois-je faire lorsque quelqu'un répond à ma question?] (Https://stackoverflow.com/help/someone-answers) – GolezTrol