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 sur objet COM


Sujet :

Langage Delphi

  1. #1
    Membre confirmé
    Avatar de annemarie
    Femme Profil pro
    Développeur multimédia
    Inscrit en
    Juillet 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2006
    Messages : 97
    Billets dans le blog
    1
    Par défaut problème d'interface sur objet COM
    bonjour,

    j'ai un soucis et je tourne en rond. Je dois interfacer un objet com et l'affection d'une chaine de caractère à un champ texte à un objet de l'interface génère une erreur dans la ndll.dll. J'ai un exemple en VB qui marche.

    Si quelqu'un a une idée.

    Code VB qui marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      If Engine.GetSceneByName("Webcams_duel", SceneObj) Then
                Dim TextObj As xpTextObject
     
                If SceneObj.GetObjectByName("Webcam1_text", TextObj) Then
                    TextObj.Text = 'toto'
                End If
    TLB de l'objet com
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     IxpTextObject = interface(IxpTexturedObject)
        ['{A64CFD48-EC26-4C6F-8D7C-78F2B9F211C0}']
        function Get_Text: WideString; safecall;
        procedure Set_Text(const Text: WideString); safecall;
        .....
        property Text: WideString read Get_Text write Set_Text;
    Mon code
    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
     
    var
      SceneObj: IxpScene;
      BaseObject: IxpBaseObject;
      TextObj: IxpTextObject;
     
    begin
          .......
          if SceneObj.GetObjectByName('Webcam1_text', BaseObject) then
          begin
            TextObj := BaseObject as IxpTextObject;
            if TextObj <> nil then
            begin
              TextObj.Text := 'toto';   <-- endroit du plantage ntdll.dll
            end;
          end;
    Dans le TLB il y a aussi les objets TxpTextObject mais je ne sais pas comment associer l'interface à l'objet.

    les dev se font en D7 mais l'équivalent en D2010 a donné la même chose.
    Bref je suis en panne ....

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Pourquoi passer par BaseObject dans le GetObjectByName ?
    Si on regarde le code VB, TextObj est directement passé dans cette fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      if SceneObj.GetObjectByName('Webcam1_text', TextObj ) then
          begin
            if TextObj <> nil then
            begin
              TextObj.Text := 'toto';   
            end;
          end;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Membre confirmé
    Avatar de annemarie
    Femme Profil pro
    Développeur multimédia
    Inscrit en
    Juillet 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2006
    Messages : 97
    Billets dans le blog
    1
    Par défaut
    je passe par le BaseObject car le GetObjectByName demande en delphi un IxpBaseObject et non un IxpTextObject. J'ai essayé et à la compilation, il ne veut pas faire le transtypage.
    Par contre cela me donne l'idée de'essayer le transtypage inverse ... je vais essayer

    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
     
    // *********************************************************************//
    // Déclaration de CoClasses définies dans la bibliothèque de types        
    // (REMARQUE: On affecte chaque CoClasse Ã* son Interface par défaut)      
    // *********************************************************************//
      xpEngine = IxpEngine;
      xpScene = IxpScene;
      xpAnimController = IxpAnimController;
      xpBaseObject = IxpBaseObject;
     
    ....
     
    IxpScene = interface(IDispatch)
        ['{CA823AF9-A276-4875-B3E1-655B5076D5DB}']
        function GetObjectByName(const Name: WideString; out BaseObject: xpBaseObject): WordBool; safecall;

  4. #4
    Membre confirmé
    Avatar de annemarie
    Femme Profil pro
    Développeur multimédia
    Inscrit en
    Juillet 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2006
    Messages : 97
    Billets dans le blog
    1
    Par défaut
    A force de bidouille en espérant comprendre et avouant que ça me dépasse un peu j'ai réussi à le faire marcher. Une petite explication des experts serait la bien venue pour les blondes (et blonds) qui tricottent en Delphi. Et une amélioration de tout ça me semblerait nécessaire ....

    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
     
    var
      SceneObj: IxpScene;
      BaseObject: IxpBaseObject;
      TextObjI: IxpTextObject;
      TextObj: TxpTextObject;
     
        if Engine.GetSceneByName(XpressScene, SceneObj, False) then
        begin
          if SceneObj.GetObjectByName('Webcam1_text', BaseObject) then
          begin
            TextObjI := BaseObject as IxpTextObject;
            TextObj := TxpTextObject.Create(self);
            try
              TextObj.ConnectTo(TextObjI);
              if TextObj <> nil then
              begin
                TextObj.Text := 'toto';
              end;
            finally
              TextObj.Disconnect;
              TextObj.Free;
            end;

  5. #5
    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
    c'est pour le moins étrange...as-tu regardé le constructeur et les méthodes ConnectTo et SetText de TxpTextObject ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre confirmé
    Avatar de annemarie
    Femme Profil pro
    Développeur multimédia
    Inscrit en
    Juillet 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2006
    Messages : 97
    Billets dans le blog
    1
    Par défaut
    Cela ressemble à ça. Etant une bille dans les interfaces et l'OleServer, j'aime bien quand çà marche et déteste quand ça marche pas. Mais je ne me suis jamais aventurée plus loin... A tort surement ... mais bon.

    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
     
    TxpTextObject = class(TOleServer)
      private
        FIntf: IxpTextObject;
    ....
      protected
        procedure InitServerData; override;
        procedure InvokeEvent(DispID: TDispID; var Params: TVariantArray); override;
      property DefaultInterface: IxpTextObject read GetDefaultInterface;
     
    .........
     
    constructor TxpTextObject.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
    {$IFDEF LIVE_SERVER_AT_DESIGN_TIME}
      FProps := TxpTextObjectProperties.Create(Self);
    {$ENDIF}
    end;
     
    procedure TxpTextObject.ConnectTo(svrIntf: IxpTextObject);
    begin
      Disconnect;
      FIntf := svrIntf;
      ConnectEvents(FIntf);   //--procedure du OleServer
    end;
     
     
    procedure TxpTextObject.Set_Text(const Text: WideString);
      { Avertissement : cette propriété Text a un setter et un getter dont
        les types ne concordent pas. Delphi n'a pas pu générer une
        propriété de cette sorte et utilise donc un Variant à la place. }
    var
      InterfaceVariant: OleVariant;
    begin
      InterfaceVariant := DefaultInterface;
      InterfaceVariant.Text := Text;
    end;

  7. #7
    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
    COM c'est pas ce qu'il y a de plus simple en même temps

    ceci dit je vois commentaire très intéressant dans le code, selon Delphi il y a un problème entre le getter et le setter...

    essaie de faire la même chose

    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
     
    var
      SceneObj: IxpScene;
      BaseObject: IxpBaseObject;
      TextObj: IxpTextObject;
      iVariant: OleVariant;
     
    begin
          .......
          if SceneObj.GetObjectByName('Webcam1_text', BaseObject) then
          begin
            TextObj := BaseObject as IxpTextObject;
            if TextObj <> nil then
            begin
              iVariant := TextObj;
              iVariant.Text := 'toto';   <-- endroit du plantage ntdll.dll
            end;
          end;
    voir même plus haut dans le code si c'est possible (iVariant := BaseObject, ou carrément iVariant au niveau de GetObjectByName)...en fait avec un Variant tu passes pas une dispinterface et l'invocation est dynamique (sans contrôle à la compilation), avec une Interface la structure est définie à la compilation et si elle est mal définie ça plante à l'exécution


    quand à l'objet TxpTextObject il permet de récupérer les évènements COM de l'objet COM associé (OnChange, etc...)
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 094
    Par défaut
    Pour l'utilisation de OleVariant
    Si tu veux pousser le sujet cherche Late Binding (classiquement en VB Script) et Early Binding (typique en Delphi)

    Sinon, ce n'est pas spécialement le COM qui est complexe mais souvent l'implémentation douteuse qui ne respecte pas les fondamentaux Automation !

    Pour ConnectTo, ça c'est une bidouille Borland des "composants enveloppe" (wrapper)
    C'est souvent le symptôme d'une utilisation de Late Binding au sein d'un Early Binding parce que justement la TLB n'est pas conforme (la dessus on peut faire tout et n'importe quoi d'ailleurs, le .NET est bcp plus rigoureux à ce sujet)

    Est-ce que tes XPBaseObject on un rapport à la couche eXpress Persistent Objects de DevExpress ?
    Ou est-ce totalement autre chose ?
    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

  9. #9
    Membre confirmé
    Avatar de annemarie
    Femme Profil pro
    Développeur multimédia
    Inscrit en
    Juillet 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2006
    Messages : 97
    Billets dans le blog
    1
    Par défaut
    non cela n'a rien à voir avec les Dev Express que j'utilise au demeurant, mais il s'agit du pilotage d'un moteur graphique sur carte Matrox. Le moteur se pilote en COM.

    Je vais étudier tous vos commentaires et liens, en tout cas merci beaucoup.

  10. #10
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 5
    Par défaut
    bonjour,

    je ne sais pas si tu travaille encore sur le ROSS mais si tu veux on peut s'échanger des infos

    a+

    videaste

Discussions similaires

  1. [COM] Problème d'instanciation d'objet COM
    Par lpapouk dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 02/07/2008, 15h14
  2. problème de collision sur objet en rotation
    Par filiplj dans le forum ODE
    Réponses: 2
    Dernier message: 21/08/2007, 16h00
  3. Problème de lecture sur port COM
    Par Marthym dans le forum MFC
    Réponses: 10
    Dernier message: 11/04/2006, 15h36
  4. Documentation sur Objet COM et ASP ?
    Par delphinote dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 08/09/2005, 20h55
  5. Problème de reception sur Port COM
    Par Revan777 dans le forum C
    Réponses: 9
    Dernier message: 19/04/2005, 21h55

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