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

Langage Delphi Discussion :

Problème d'interface objets externes avec GUID


Sujet :

Langage Delphi

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Maker
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Maker
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Problème d'interface objets externes avec GUID
    Bonjour à tous,

    Cela fait 3 jours à temps complet que je cherches vainement
    à faire l'interface avec un activeX et je suis au bout de tout
    ce qu'il me semblait possible de faire.

    J'ai essayé 2 méthodes que j'ai lu et relu dans plein d'exemple de
    code sur github ou ailleurs mais la plupart du temps en C++ du coup
    j'ai du mal à transformer en Delphi. (pour info je suis sous Delphi6)


    voilà ce que j'essaye de faire, j'espère que je sera clair :

    Première méthode utilisée:

    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
     
    const 
     
      IID_IDeviceVoulu : TGUID = '{xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}';
     
    type 
     
      IDeviceVoulu = interface(IUnknown)
        ['{xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}']
        function FonctionNum1(): HRESULT; stdcall;
        function FonctionNum2(): HRESULT; stdcall;
      end;
     
     
    implementation
     
    procedure UneAutreFonctionLocale();
    var
      pDeviceVoulu: IDeviceVoulu;
      o : PObject;
      Dev : IMMDevice;
    begin
     
      if not Succeeded(Dev.ActivateIID_IDeviceVoulu, CLSCTX_INPROC_SERVER, nil, o)) then
        RaiseLastOSError;
     
      pDeviceVoulu:= o as IDeviceVoulu; // <<< ERREUR
     
      if not Succeeded(pDeviceVoulu.FonctionNum1()) then
        RaiseLastOSError;
     
    end;

    Dans ce cas là il me répond : [Erreur] xxxx.pas(27): Types Incompatibles : 'IDeviceVoulu' et 'TObject'

    Or j'ai lu partout que si on utilise un IInterface par GUID ça devrait fonctionner ???


    Du coup, j'ai tenté de contourner le problème en créant un TDeviceVoulu intermédiaire ( là plus de souci
    sur le "as" mais ailleurs...

    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
     
    const 
     
      IID_IDeviceVoulu : TGUID = '{xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}';
     
    type 
     
      IDeviceVoulu = interface(IUnknown)
        ['{xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}']
        function FonctionNum1(): HRESULT; stdcall;
        function FonctionNum2(): HRESULT; stdcall;
      end;
     
      TDeviceVoulu = class(TObject, IDeviceVoulu)  // <<<<< ERREUR
      end;
     
     
    implementation
     
    procedure UneAutreFonctionLocale();
    var
      pDeviceVoulu: TDeviceVoulu;
      o : PObject;
      Dev : IMMDevice;
    begin
     
      if not Succeeded(Dev.ActivateIID_IDeviceVoulu, CLSCTX_INPROC_SERVER, nil, o)) then
        RaiseLastOSError;
     
      pDeviceVoulu:= o as TDeviceVoulu;
     
      if not Succeeded(pDeviceVoulu.FonctionNum1()) then
        RaiseLastOSError;
     
    end;
    Il me jette en me disant que les fonctions de l'interface sont manquantes dans la décalration du TDeviceVoulu, et si
    je les ajoute, il me dit qu'elles, ne sont pas implémentés!! mais je ne peux pas les implémenter pusque justement
    elles sont externes, je les récupère !! Ca se mord la queue.

    Je suis bien conscient que je n'ai pas réussi du coup à saisir le mécanisme en jeu, et que je dois m'y prendre
    comme une grosse nouille, alors si une âme charitable pouvait prendre 2 minutes pour m'expliquer ce que j'ai
    pris de travers, je vous serais vraiment reconnaissant !!

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if not Succeeded(Dev.ActivateIID_IDeviceVoulu, CLSCTX_INPROC_SERVER, nil, o)) then
    il manque un bout genre la fonction CoCreateInstance … sans même tester ( et )) ça compile pas !
    PObject c'est particulierement douteux !
    même TObject cela aurait été incorrect, et le as de D6 ne devait pas permettre les transtypages Objet/Interface mais Interface/Interface, c'est si vieux que je n'en souviens plus, j'ai jamais as dans ce cas
    je préfére Supports qui est plus proche d'une sorte de Succeeded(As())

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function CoCreateInstance(const clsid: TCLSID; unkOuter: IUnknown;  dwClsContext: Longint; const iid: TIID; out pv): HResult; stdcall;
    IID_IDeviceVoulu doit être un vrai GUID, pas des x, tu as un ActiveX qui a été enregistré, tu peux même l'installer dans Delphi, faire générer le TLB Wrapper et tu auras les fabriques tout prête à l'utilisation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var
      pDeviceVoulu: IDeviceVoulu;
    begin
      if not Succeeded(  CoCreateInstance(IID_IDeviceVoulu,  CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, IDeviceVoulu, pDeviceVoulu)) then
    Tu n'as même pas besoin du as après si ton ActiveX recense toutes ses interfaces
    Sinon, tu devras faire effectivement un CoCreateInstance sur IID recensé puis faire le Supports ou as
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Maker
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Maker
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Merci ShaiLeTroll pour la réponse!

    Alors effectivement j'ai pas voulu recopier tout mon code du coup j'ai écris ça vite fait pour l'exemple, mais effectivement c'est TObject et pas PObject dans mon code, et j'ai bien un CoCreate avant de faire quoi que ce soit.

    Ta piste du "as" qui à l'époque ne permettait pas de faire Object/Interface est assez plausible, je me suis vraiment posé la question car j'avais bien l'impression de faire ce qu'il fallait.

    Avec Support du coup tu procèderais comment ?

  4. #4
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    Bonjour

    Je ne me souviens plus si cette option existait sous Delphi 6 (mais c'est probable que oui) : pourquoi n'importes-tu pas simplement ton Active X sous Delphi avec l'outil correspondant ?

    Au pire, si tu ne l'as pas dans ta version, tu peux te simplifier la tâche en prenant une licence de la Community Edition (si ton cas n'enfreint pas la licence) ou d'évaluation pour le faire.

Discussions similaires

  1. Problème d'interface en Java avec Eclipse
    Par lou87 dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 26/01/2012, 17h02
  2. Problème de table liée externe avec ORACLE LOADER
    Par culass dans le forum Import/Export
    Réponses: 1
    Dernier message: 01/06/2011, 18h03
  3. Problème de variables et GUI avec GUIDE
    Par drfell dans le forum Interfaces Graphiques
    Réponses: 6
    Dernier message: 21/05/2009, 16h40
  4. Problème lien externe avec IE
    Par m@t dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 03/04/2006, 15h10
  5. jointure externe avec un where, me pose problème!
    Par Danae dans le forum Langage SQL
    Réponses: 3
    Dernier message: 18/07/2005, 17h37

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