IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

Problème utilisation d'un ActiveX


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre habitué
    Inscrit en
    Novembre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 11
    Par défaut Problème utilisation d'un ActiveX
    Bonjour à tous,

    Je n'arrive pas à utiliser un ActiveX d'un fournisseur.
    Cet ActiveX est en fait un objet .Net qui supporte COM.

    J'ai deux approches possibles:
    -1- utilisation direct de l'ActiveX importé dans mon application Delphi
    -2- affichage d'une page HTML incorporant l'ActiveX avec un WebBrowser.

    Je préfère la deuxième approche car elle est plus souple. Mais de toute façon rien ne marche pour l'instant.

    Approche 1:
    J'ai d'abord vérifié que je pouvais inclure l'ActiveX dans une UserForm de Word: c'est Ok.
    Avec Delphi 2006, l'importation sous la forme d'un ActiveX ou d'un Assembly .Net échoue. J'arrive faire l'import à partir de la bibliothèque de types.
    Ensuite, quand je pose le composant sur une form, j'ai une erreur "fichier non trouvé".
    Avec Delphi 2010, je n'arrive pas importer l'ActiveX. L'import de l'assembly .Net
    et de la bibliothèque de type fonctionne. Je peux ensuite poser le composant sur une TForm (tout devient très lent). Je peux compiler l'application nmais je ne peux pas l'exécuter: rien n'apparaît à l'écran, je suis obligé de tuer le process à travers le gestionnaire des taches (CPU à 0 %).
    J'ai essayer d'utiliser l'objet COM directement, sans passer par un composant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    procedure TForm1.InvokeCLSIDClick(Sender: TObject);
    var
        clsid: TCLSID;
        sCLSID: string;
        result: hresult;
        localCLSCTX: Integer;
        IApp: IUnknown;
        ClassFactory2: IClassFactory2;
        ProgId: PWideChar;
    begin
        // initialize COM
        ProgId := 'ActiveX_Test.AxControl';  //for Acrobat Reader: 'AcroPDF.PDF.1'
     
        CoInitialize(nil);
     
        localCLSCTX := CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER;
        try
            // Get CLSID from ProgId
            result := CLSIDFromProgID(ProgId, clsid); //I get '21CD2964-DC18-4C02-A26F-4430AFB00C1F' 
            OleCheck(result);                         //for Acrobat Reader, I get 'CA8A9780-280D-11CF-A24D-444553540000'
     
            result := CoGetClassObject(clsid,localCLSCTX,nil,IID_IClassFactory, ClassFactory2);
            OleCheck(result);
            ShowMessage('Class ActiveX_Test.AxControl CoGetClassObject OK'); //here, all is Ok
     
            result := ClassFactory2.CreateInstance(nil,System.TGUID(IID_IUnknown), IApp); //Application hangs with the test ActiveX
            OleCheck(result);                                                             //with Acrobat Reader it is working
     
            ShowMessage('Class ActiveX_Test.AxControl CreateInstance OK');
        except
            on e: EOleSysError do
            begin
                ShowMessage('Class MWV_ActiveX_Test.AxControl invoke error');
            end;
        end;
     
        // deinitialize COM
        CoUninitialize;
    end;
    ça se bloque au niveau du CreateInstance.

    Approche 2
    Voici le fichier HTML qui incorpore l'ActiveX:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <HTML>
    <HEAD>
    </HEAD>
    <BODY>
     
    <OBJECT ID="Control" Name="Control" WIDTH=312 HEIGHT=445
     CLASSID="CLSID:21CD2964-DC18-4C02-A26F-4430AFB00C1F">
    <p>Error loading activeX. Either control not installed or it is disabled by a security setting</p>
    </OBJECT>
     
    <script type="text/javascript" for="Control" event="Event1Fired">
    	alert("Event1Fired event handled via javascript handler");
    </script>
     
    <script type="text/javascript" for="Control" event="Event2Fired">
    	alert("Event2Fired event handled via javascript handler");
    </script>
     
    </BODY>
    </HTML>
    Après avoir réglé les options de sécurité d'Internet Explorer, j'arrive ouvrir la page html directement dans Internet Explorer sans qu'il y ait de messages.

    En utilisant le TWebBrowser de Delphi j’obtiens des résultats très étranges:
    Avec mon application déja existante faite sous D2006 ça marche dans mon environnement de développement (machine virtuelle XP avec IE6), ça marche sous ma machine hôte Seven 32 bits avec IE8, par contre ça ne marche pas sur le PC destination que je voudrais utiliser (XP pro 32 bits avec IE7, puis j'ai essayé IE8). (ne marche pas = l'application freeze, CPU à 0 %)
    Les frameworks 2.0, 3.5, et 4 sont installés.
    Le plus étrange c'est que si je créé une nouvelle application à partir de zéro, et je fais un copier collé du WebBrowser de mon application déjà existante, le résultat ne marche pas dans ma machine virtuelle, ne marche pas sur le PC de destination mais ça marche sous mon Seven.

    Je ne sais plus quoi faire. Si quelqu'un à une piste, merci d'avance.

  2. #2
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    et si tu passes par ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    const
      guid: TGUID = '{21CD2964-DC18-4C02-A26F-4430AFB00C1F}';
    var
      iapp: IUnknown;
    begin
      CoCreateInstance(guid,  CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, IUnknown, iapp);
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre habitué
    Inscrit en
    Novembre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 11
    Par défaut
    J'ai essayé ça en Delphi 2006:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ActiveX;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    const
      guid: TGUID = '{21CD2964-DC18-4C02-A26F-4430AFB00C1F}';
    var
      iapp: IUnknown;
      result: hresult;
    begin
      result := CoCreateInstance(guid, nil,  CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, IUnknown, iapp);
      //OleCheck(result);
     
      ShowMessage('Class ActiveX_Test.AxControl CreateInstance OK '+IntToStr(result)+ '');
     
    end;
    ça me retourne un HResult de -2147221008

    Si j'encadre par un CoInitialize(nil) et CoUninitialize, ça se bloque.
    Si dans la section Uses, je met ComObj (pour avoir OleCheck), ça se bloque aussi.

Discussions similaires

  1. problème utilisation Activex
    Par Wassim123 dans le forum Interfaces Graphiques
    Réponses: 0
    Dernier message: 02/12/2008, 11h14
  2. [JSTL] [EL] Problème utilisation <c:out>
    Par XavierL dans le forum Taglibs
    Réponses: 7
    Dernier message: 14/08/2005, 20h12
  3. (Problème) Utilisation de l'API mySQL [Delphi 2005 Perso]
    Par will-scs dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/08/2005, 18h26
  4. [ActiveX] Peut-on utiliser un Controle ActiveX avec Java
    Par waldo2188 dans le forum Multimédia
    Réponses: 2
    Dernier message: 22/02/2005, 11h39
  5. [JAR]Problème utilisation manifest et jar
    Par doudine dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 07/01/2005, 10h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo