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 :

Créer une classe qui implémente une DispInterface


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 78
    Points : 48
    Points
    48
    Par défaut Créer une classe qui implémente une DispInterface
    Bonjour,
    J'ai une DispInterface importée d'une librairie externe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ITelescopeV3 = dispinterface
        ['{A007D146-AE3D-4754-98CA-199FEC03CF68}']
    .
    .
    end;
    Je souhaiterais créer une class du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TTelescope = class(TAutoObject, ITelescopeV3)
    Mais cela ne passe pas, 'Type d'interface necessaire'
    Je pédale un peu là!
    Merci de votre aide
    Michel

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 763
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 763
    Points : 13 381
    Points
    13 381
    Par défaut
    Tu ne peux pas directement créer une classe à partir d'un dispinterface, c'est utilisé par IDispatch pour accéder à un serveur COM. Il faut une déclaration d'interface (dérivée de IDispatch) contenant les mêmes informations et même IID.

    Mais tu n'as pas besoin de coder cela toi-même, Delphi peut générer ces structures pour toi.

    Pour du early-binding (contrôle des types à la compilation). A partir du moment ou l'application cible (le serveur COM) est installée sur ton poste : menu Composant → Importer un composant → Importer une bibliothèque de types. Ceci générera un fichier quelquechose_TLB.pas directement utilisable dans ton code. Et si tu as activé Wrapper de composant, tu auras même un nouveau composant dans la palette.

    Mais on peut aussi s'en passer complètement et travailler en late-binding (là les erreurs ne se verront qu'à l'exécution) en invoquant CreateOLEObject. Il te faut pour cela juste le nom du serveur COM (pas l'exe). Par contre à toi de déterminer clairement les types de paramètres puisqu'il n'y a aucun contrôle à la compilation.

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    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 586
    Points : 25 262
    Points
    25 262
    Par défaut
    En delphi, tu peux utiliser ASCOM directement via les Drivers bas niveaux ou via l'interopérabilité COM : https://ascom-standards.org/About/CompatLang.htm

    Cela a installé des DLL lorsque tu as installé le Tool Kit
    Suit la procédure de AndNotOr pour que la DLL soit importé dans Delphi sous la forme de wrapper de bibliothèque de types.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 78
    Points : 48
    Points
    48
    Par défaut
    Bonjour,
    C'est ce que j'ai fait mais je me retrouve avec un fichier ASCOM_DeviceInterfaces_TLB, mais dedans ce ne sont que des dispinterfaces, pas des interfaces et je n'arrive pas à les utiliser, et malgré 'wrapper coché', pas de nouveau composant?? J'imagine que c'est une question bête, mais les dispinterfaces ce n'est pas ma tasse de thé, :-(
    Michel

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    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 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Tu n'as pas de CoClasse genre un TDeviceInterface ?
    ou un autre type qui commence par T ... c'est lui que l'on instancie c'est l'objet principal, ensuite lui peut soit avoir des propriétés pour les autres objets et il faut éventuellement jongler avec la fonction Supports() pour utiliser les variantes d'interface.

    https://ascom-standards.org/Help/Dev...eInterface.htm

    As-tu plusieurs DLL voir plusieurs bibliothèque de types, cela arrive parfois qu'il y ait un point d'entrée qui sert factory pour toutes les autres.

    EDIT, la factory semble être https://ascom-standards.org/Help/Dev...es_Chooser.htm dans ASCOM.Utilities.dll qui est bien une autre DLL que ASCOM.DeviceInterfaces.dll

    Il y a 5 DLL en tout

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 78
    Points : 48
    Points
    48
    Par défaut
    J'ai ça:
    Nom : Capture d'écran 2024-04-25 111856.png
Affichages : 81
Taille : 174,7 Ko

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    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 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Il faudrait plutôt contacter le fournisseur du logiciel pour savoir quelles sont les DLL à charger et éventuellement des exemples dans un langage proche de Delphi, peut-être en FreePascal, en C++ ou en VB6 (pas .NET)

    C'est trop spécifique pour que l'on puisse répondre.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 78
    Points : 48
    Points
    48
    Par défaut
    Merci déjà beaucoup pour l'aide. Si je trouvais un moyen d'utiliser le DispInterface pour faire une interface, cela me sauverait surement. Pour les exemples, malheureusement, ils travaillent tous en C#.
    Michel

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    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 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Faut chercher des versions C++ à base de CoCreateInstance

    Tiens regarde cette TLB, est-ce que tu retrouves une structure similaire ?
    Par exemple une classe CoTelescope par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      CoTelescope = class
        class function Create: ITelescope;
        class function CreateRemote(const MachineName: string): ITelescope;
      end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class function CoTelescope.Create: ITelescope;
    begin
      Result := CreateComObject(CLASS_Telescope) as ITelescope;
    end;
     
    class function CoTelescope.CreateRemote(const MachineName: string): ITelescope;
    begin
      Result := CreateRemoteComObject(MachineName, CLASS_Telescope) as ITelescope;
    end;

  10. #10
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 435
    Points : 5 848
    Points
    5 848
    Par défaut
    salut

    a priori c'est cela qu'il veut traduire en Delphi

    IL y a une petit exposé de laurent dardenne sur le sujet ici

Discussions similaires

  1. [REFLEXION] Connaitre toutes les classes qui implémentent une interface
    Par narmataru dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 25/10/2006, 11h00
  2. [POO] Une classe qui fait tout ?
    Par Nasky dans le forum Langage
    Réponses: 23
    Dernier message: 26/05/2006, 20h02
  3. Réponses: 7
    Dernier message: 25/03/2005, 14h05
  4. Réponses: 14
    Dernier message: 14/03/2005, 09h16
  5. destruction d'une classe qui herite de CDialog
    Par philippe V dans le forum MFC
    Réponses: 2
    Dernier message: 03/02/2004, 17h39

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