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 :

Instancier une interface dont on a que la définition ?


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 68
    Points : 32
    Points
    32
    Par défaut Instancier une interface dont on a que la définition ?
    Je pense que c'est impossible mais ne sait-on jamais.
    COM, OLE... ça reste un peu flou pour moi tout ça malheureusement :-/

    J'explique mon problème :

    Je dois utiliser les services d'une application externe et voilà les seuls éléments que l'on m'a fourni :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    I_TrucModule = interface(IDispatch)
          function openModule(const parameters: WideString; out ret: integer): integer;
          function closeModule(handle: integer): integer;
    end;
    Youpi, ça fait bien maigre !

    Dans ma joie j'ai essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure truc;
    var
       IModule: I_TrucModule;
    begin
       IModule:= CreateComObject(I_TrucModule) as I_TrucModule;
       ...
    end;

    Bien sur, ça ne fonctionne pas, Delphi se plaint que l'interface n'a pas d'identification d'interface (GUID).
    Effectivement y'en a pas.

    si je modifie la déclaration de l'interface comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    I_TrucModule = interface(IDispatch)
        ['{ECB83782-59AE-11D5-8AC5-0010DC1854D7}']
          function openModule(const parameters: WideString; out ret: integer): integer;
          function closeModule(handle: integer): integer;
    end;
    Là ça compile car j'ai mis un numéro de GUID fictif...
    le bon, je l'ai pas... Dois-je impérativement l'avoir ? ou existe-il une méthode magique pour récupérer un GUID d'interface ou directement une instance à partir de son nom (ITruc par exemple) ?
    Merci d'avance !

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut Re: Intancier une interface (ITruc) dont on a la définition
    Citation Envoyé par Stef_D
    Youpi, ça fait bien maigre !
    Faut "positiver", cela aurait pu être pire
    Citation Envoyé par Stef_D
    Dois-je impérativement l'avoir ?
    Ce serais bien oui, sinon comment savoir quel est l'objet qui implémente cette interface ?
    On ne t'as pas fournit une boule de cristal, franchement il y en a qui exagére 8)

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 68
    Points : 32
    Points
    32
    Par défaut Re: Intancier une interface (ITruc) dont on a la définition
    Citation Envoyé par Laurent Dardenne
    Citation Envoyé par Stef_D
    Youpi, ça fait bien maigre !
    Faut "positiver", cela aurait pu être pire
    Citation Envoyé par Stef_D
    Dois-je impérativement l'avoir ?
    Ce serais bien oui, sinon comment savoir quel est l'objet qui implémente cette interface ?
    On ne t'as pas fournit une boule de cristal, franchement il y en a qui exagére 8)
    Merci, c'est bien ce qu'il me semblait...
    J'espérais peut-être une fonction qui puisse à partir du nom d'une interface (héritant de IDispatch) retrouver l'objet qui l'implémente.
    Enfin s'il est possible d'avoir plusieurs objets implémentant la même interface cela poserait problème (je sais pas si c'est possible).

  4. #4
    Membre averti
    Avatar de HumanTool
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2006
    Messages : 276
    Points : 378
    Points
    378
    Par défaut
    salut,
    je sais que dans ComObj.pas il ya les fonctions StringToGUID() et GUIDToString(), peut être que tu les utiliser ? (je ne les ai jamais utilisé mais leur noms sont expicites et l'aide fonctionne sur c fonctions...)
    sinon dans ActiveX.pas y a les fonctions API StringFromCLSID, CLSIDFromString; à voir (la non plus je ne les ai pas utilisée)

    bon courage

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 68
    Points : 32
    Points
    32
    Par défaut
    Merci, c'est exactement ce que je cherchais !!
    J'ai pas encore essayé (je vais le faire) mais comme tu dis, le nom des fonctions est plutot explicite

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 68
    Points : 32
    Points
    32
    Par défaut
    Arf, je me suis un peu emballé... ces fonctions permettent de convertir le GUID ou CLSID en string et vice-versa, mais ne permettent pas de retourner un CLSID à partir d'un nom d'interface. Merci encore.
    Je pense que ça ne doit pas être possible, tout simplement.

  7. #7
    Membre averti
    Avatar de HumanTool
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2006
    Messages : 276
    Points : 378
    Points
    378
    Par défaut
    ah...tant pis mais c'est bon pour infos !

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 68
    Points : 32
    Points
    32
    Par défaut
    je te remercie d'avoir essayé de m'aider
    J'ai demandé plus d'infos à la personne qui m'a donné les documents... ça va encore prendre une plombe je le sens.

  9. #9
    Membre averti
    Avatar de HumanTool
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2006
    Messages : 276
    Points : 378
    Points
    378
    Par défaut

  10. #10
    Membre habitué
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 151
    Points
    151
    Par défaut
    Salut

    L'interet d'une interface reside en autres dans le fait de pouvoir l'mplémenter par plusieurs classes.Donc ca ne pose aucun problème;Pour exemple tous les objets COM implémentent IUnknown.

    Une même classe peut implémenter plusieurs interfaces.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 68
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par inoussa
    Salut

    L'interet d'une interface reside en autres dans le fait de pouvoir l'mplémenter par plusieurs classes.Donc ca ne pose aucun problème;Pour exemple tous les objets COM implémentent IUnknown.

    Une même classe peut implémenter plusieurs interfaces.
    Salut,

    De ce fait, il est impossible d'avoir une fonction qui, pour un nom d'interface donnée, puisse me retrouner un GUID ou CLSID d'objet implémentant cette interface ?
    Et ainsi pouvoir en récupérer une instance...

  12. #12
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Il te faut avant tout connaitre le propriétaire de cette interface (Objet Delphi ou COM) ou au moins une référence quelconque, ensuite tu peux utiliser la Supports de l'unité Sysutils qui permet de déterminer si un objet, une interface ou une classe supporte une interface donné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
     //Appel sur une interface 
    function Supports(const Instance: IInterface; const IID: TGUID; out Intf): Boolean; 
    begin 
      Result := (Instance <> nil) and (Instance.QueryInterface(IID, Intf) = 0); 
    end; 
     
     //Appel sur une classe 
    function Supports(const Instance: TObject; const IID: TGUID; out Intf): Boolean; 
    var 
      LUnknown: IUnknown; 
    begin 
      Result := (Instance <> nil) and 
                ((Instance.GetInterface(IUnknown, LUnknown) and Supports(LUnknown, IID, Intf)) or 
                 Instance.GetInterface(IID, Intf)); 
    end; 
     
     //Appel sur une référence de classe 
    function Supports(const AClass: TClass; const IID: TGUID): Boolean; 
    begin 
      Result := AClass.GetInterfaceEntry(IID) <> nil; 
    end;

  13. #13
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Peut-être une idée :
    Les GUID sont enregistré dans la base de registre.
    - l'ouvrir avec le programme RegEdit,
    - essayer de trouver la chaine "TrucModule" et voir si il y a un GUID qui correspond dans clé,valeur ou données.

Discussions similaires

  1. instancier une interface
    Par new_wave dans le forum Débuter
    Réponses: 2
    Dernier message: 26/04/2013, 11h30
  2. Interpoler une image dont on a que quelques pixels
    Par neF4ST dans le forum Traitement d'images
    Réponses: 7
    Dernier message: 17/08/2011, 15h07
  3. Possible d'instancier une interface ?
    Par nuriel2 dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 27/03/2010, 23h07
  4. Instancier une classe dont le nom est contenu dans une String
    Par fyque dans le forum Général Python
    Réponses: 15
    Dernier message: 13/06/2008, 12h33
  5. Instancier une classe dont le nom est une variable
    Par bendev dans le forum Langage
    Réponses: 1
    Dernier message: 06/11/2006, 06h01

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