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 :

Recuperation d'evenement venu d'une DLL


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 3
    Par défaut Recuperation d'evenement venu d'une DLL
    Bonjour,

    Etant nouveau sur Delphi, j'ai surement mal fait quelque chose.

    Dans mon programme delphi, j'ai importer une DLL fournis par un constructeur de GPS pour l'intégrer a mon programme.

    J'ai fait bêtement ce que je pensait etre le mieux : J'ai fait dans mon RAD Studio, 'Composants > Importer ActiveX et spécifier le TLB correspondant a ma DLL ActiveX'

    J'arrive sans problème a démarrer les fonctions de lectures et d'écriture du périphérique, cela marche sans problèmes.

    Sauf que, j'aimerais récupérer des évènements venu de cet Activex/DLL.
    Seulement je sais qu'en VB, cela s'écrit juste via :
    AddHandler instanceDLL.evenement, AddressOf Evenement

    et j'aimerais savoir comment pouvoir récupérer ces évènements pour faire mes tratements dessus.

    Avant tout "Google is your friend" et "recherche sur le forum", cela fait 2 jours que j epluche ce forum et autant google.

    Je vous remercie d'avance

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 115
    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 115
    Par défaut
    J'ignore comment c'est foutu, mais tu as en général une Interface déclaré dans la TLB que tu dois implémenter pour gérer les evénements, en général cette interface s'appelle comme le nom de l'objet et contient le mot "event", ensuite tu dois affecter cette interface event à une propriété présente dans l'interface principale ...

    tu peux passer le Wrapper TLB en fichier joint sur le forum ... ça permettrait d'avoir une base tangible pour t'aider ...
    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
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 3
    Par défaut
    Merci beaucoup de m'avoir répondu,
    J'ai effectivement une Function qui fini par EventHandler.

    Apparement, il faut l'instancier avec un Create ou un CreateRemote.
    Mais cela me fait une exception type EOleSysError classe non enregistré.

    Ce que je ne comprend pas, c'est qu'en VB (oui je sais...), on créer un AddHandler en 1 ligne, je saisie pas trop ce qu'il faut faire en Delphi.

    Faut-il créer un serveur Ole/Com pour pouvoir via l'instance de ce serveur gerer des events ?

    Donc grosse inconnu pour moi !

    Et encore merci pour ta réponse.

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 115
    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 115
    Par défaut
    Comme je l'a dit, impossible de savoir ce qu'il faut te répondre sans plus de précision, fourni la TLB.pas

    il faut implémenter en général une classe Event !
    en VB, cela doit être plus simple car le langage est totalement orienté ActiveX, en Delphi, tous ces mécanismes doivent être fait explicitement ... ce que j'explique par l'implémentation de l'interface event est expliqué dans l'aide, cherche autour de IConnectionPoint et IConnectionPointContainer
    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

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 115
    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 115
    Par défaut
    Tu pouvais mettre la TLB en fichier joints directement a cette discussion, mais bon par MP, passons ...

    le seul event que je vois c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    __Client = dispinterface
    ['{DFCA7FA1-1398-407D-8507-727736E6AAD4}']
    procedure OnNewMessage(const Type_: WideString; const Message: WideString); dispid 1;
    end;
    dans ton code, je pense que c'est assez simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var
      ObjClient: TClient;
    begin
      ObjClient := TClient.Create(nil);
      try
        ObjClient.OnNewMessage := Self.NewMessageEventHandler;
      finally
        ObjClient.Free();
      end; 
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm.NewMessageEventHandler(ASender: TObject; const Type_: WideString; const Message: WideString);
    begin
      ... ASender ça doit être un TClient
    end;
    tu peux même tout faire par l'IDE, ce composant correctemnet installé doit se voir dans la palette et tu peux l'utiliser directement dans une Form ou un DataModule ...
    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

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 3
    Par défaut
    Merci beaucoup Shai !

    Tu m'as beaucoup aidé et je t'en remercie !
    La réponse etait toute simple, mais si comme moi on connait que tres peut delphi, on risque pas de comprendre l'astuce.

    Encore Merci !

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 18
    Par défaut
    Bonjour,

    J'ai un peu le même problème, mais la solution proposée ne fonctionne pas chez moi. Ca m'a l'air un peu plus compliqué. Voici les extraits de mon fichier TLB qui concernent mon problème :

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    // *********************************************************************//
    // Interface :   _D_Receive_Status
    // Indicateurs : (4432) Hidden Dual OleAutomation Dispatchable
    // GUID :        {30C97D2F-08A2-3841-9564-BB7AAE8F1733}
    // *********************************************************************//
      _D_Receive_Status = interface(IDispatch)
        ['{30C97D2F-08A2-3841-9564-BB7AAE8F1733}']
      end;
     
    // *********************************************************************//
    // DispIntf :    _D_Receive_StatusDisp
    // Indicateurs : (4432) Hidden Dual OleAutomation Dispatchable
    // GUID :        {30C97D2F-08A2-3841-9564-BB7AAE8F1733}
    // *********************************************************************//
      _D_Receive_StatusDisp = dispinterface
        ['{30C97D2F-08A2-3841-9564-BB7AAE8F1733}']
      end;
     
    // *********************************************************************//
    // Interface :   _D_Receive_Timer
    // Indicateurs : (4432) Hidden Dual OleAutomation Dispatchable
    // GUID :        {10ED5C42-AE4E-323B-9648-736D38C94B10}
    // *********************************************************************//
      _D_Receive_Timer = interface(IDispatch)
        ['{10ED5C42-AE4E-323B-9648-736D38C94B10}']
      end;
     
    // *********************************************************************//
    // DispIntf :    _D_Receive_TimerDisp
    // Indicateurs : (4432) Hidden Dual OleAutomation Dispatchable
    // GUID :        {10ED5C42-AE4E-323B-9648-736D38C94B10}
    // *********************************************************************//
      _D_Receive_TimerDisp = dispinterface
        ['{10ED5C42-AE4E-323B-9648-736D38C94B10}']
      end;
     
    // *********************************************************************//
    // DispIntf :    Receive_Status_Event
    // Indicateurs : (4096) Dispatchable
    // GUID :        {5AA1A98A-6775-4E77-89EE-0B9A6B69DFDD}
    // *********************************************************************//
      Receive_Status_Event = dispinterface
        ['{5AA1A98A-6775-4E77-89EE-0B9A6B69DFDD}']
        procedure ReceiveStatusMessage(aSender: OleVariant; const aMessage: WideString); dispid 1610743808;
        procedure ReceiveTimeStep(aSender: OleVariant; aTSimul: Integer; aDureeSimul: Integer); dispid 1610743809;
      end;
     
    // *********************************************************************//
    // Interface :   _RT2012_Facade
    // Indicateurs : (4560) Hidden Dual NonExtensible OleAutomation Dispatchable
    // GUID :        {4528AB7B-431D-359F-B852-0D9022BF1388}
    // *********************************************************************//
      _RT2012_Facade = interface(IDispatch)
        ['{4528AB7B-431D-359F-B852-0D9022BF1388}']
        function Get_ToString: WideString; safecall;
        function Equals(obj: OleVariant): WordBool; safecall;
        function GetHashCode: Integer; safecall;
        function GetType: _Type; safecall;
        procedure add_ReceiveTimeStep(const value: _D_Receive_Timer); safecall;
        procedure remove_ReceiveTimeStep(const value: _D_Receive_Timer); safecall;
        procedure add_ReceiveStatusMessage(const value: _D_Receive_Status); safecall;
        procedure remove_ReceiveStatusMessage(const value: _D_Receive_Status); safecall;
        function Get_Password: WideString; safecall;
        procedure Set_Password(const pRetVal: WideString); safecall;
        function Get_VersionRT2012: WideString; safecall;
        function Get_Is_AutoWriting_XMLFile: WordBool; safecall;
        procedure Set_Is_AutoWriting_XMLFile(pRetVal: WordBool); safecall;
        function Run_From_XMLFile(const aRT_XML_File_Path: WideString): _RT_Data_Sortie_Projet; safecall;
        function Run_From_Project_Variant(aRT_Data_Projet: OleVariant): _RT_Data_Sortie_Projet; safecall;
        function Run_From_Project(const aRT_Data_Projet: _RT_Data_Projet): _RT_Data_Sortie_Projet; safecall;
        property ToString: WideString read Get_ToString;
        property Password: WideString read Get_Password write Set_Password;
        property VersionRT2012: WideString read Get_VersionRT2012;
        property Is_AutoWriting_XMLFile: WordBool read Get_Is_AutoWriting_XMLFile write Set_Is_AutoWriting_XMLFile;
      end;
     
    // *********************************************************************//
    // DispIntf :    _RT2012_FacadeDisp
    // Indicateurs : (4560) Hidden Dual NonExtensible OleAutomation Dispatchable
    // GUID :        {4528AB7B-431D-359F-B852-0D9022BF1388}
    // *********************************************************************//
      _RT2012_FacadeDisp = dispinterface
        ['{4528AB7B-431D-359F-B852-0D9022BF1388}']
        property ToString: WideString readonly dispid 0;
        function Equals(obj: OleVariant): WordBool; dispid 1610743809;
        function GetHashCode: Integer; dispid 1610743810;
        function GetType: _Type; dispid 1610743811;
        procedure add_ReceiveTimeStep(const value: _D_Receive_Timer); dispid 1610743812;
        procedure remove_ReceiveTimeStep(const value: _D_Receive_Timer); dispid 1610743813;
        procedure add_ReceiveStatusMessage(const value: _D_Receive_Status); dispid 1610743814;
        procedure remove_ReceiveStatusMessage(const value: _D_Receive_Status); dispid 1610743815;
        property Password: WideString dispid 1610743816;
        property VersionRT2012: WideString readonly dispid 1610743818;
        property Is_AutoWriting_XMLFile: WordBool dispid 1610743819;
        function Run_From_XMLFile(const aRT_XML_File_Path: WideString): _RT_Data_Sortie_Projet; dispid 1610743821;
        function Run_From_Project_Variant(aRT_Data_Projet: OleVariant): _RT_Data_Sortie_Projet; dispid 1610743822;
        function Run_From_Project(const aRT_Data_Projet: _RT_Data_Projet): _RT_Data_Sortie_Projet; dispid 1610743823;
      end;
    Comment faire pour récupérer les évenements ReceiveStatusMessage et ReceiveTimeStep qui sont censé être dans l'objet facade pour afficher mes barres d'état et de progression.

    Merci d'avance pour votre aide.

  8. #8
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 115
    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 115
    Par défaut
    Je pense que tu dois implémenter un objet Receive_Status_Event coté appelant, tu dois avoir un SetEventSink\ConnectEvents pour lui passer l'interface implementée !

    Gestion d'événements Automation sous Delphi


    tu as une option dans l'importateur pour générer ou non le support des évèments COM

    Je me demande même si tu ne dois pas implementer Receive_Status_Event mais aussi _D_Receive_Status, _D_Receive_Timer (juste ajoute dans la déclaration pour que Supports fonctionne) et ainsi passer l'objet à add_ReceiveTimeStep ...

    Si c'est ça, cela a été codé avec les pieds !

    le Com intègre une gestion d'évènement et Delphi peut te générer tous le code qui tu veux (ou tu peux le faire à la main pour forcer la gestion de exceptions)


    Pour la solution apportée à arkan9el, en fait comme il avait du fournir le code par MP, il nous manque des informations comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TClientOnNewMessage = procedure(ASender: TObject; const Type_: WideString; const Message: WideString) of object;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      TClient = class(TOleServer)
      private
        FOnNewMessage: TClientOnNewMessage;
        FIntf: _Client;
     
        procedure InvokeEvent(DispID: TDispID; var Params: TVariantArray); 
     
      published
        property OnNewMessage: TClientOnNewMessage read FOnNewMessage write FOnNewMessage;
      end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TClient.InvokeEvent(DispID: TDispID; var Params: TVariantArray);
    begin
      case DispID of
        -1: Exit;  // DISPID_UNKNOWN
        1: if Assigned(FOnNewMessage) then
             FOnNewMessage(Self,
                           Params[0] {const WideString},
                           Params[1] {const WideString});
      end; {case DispID}
    end;
    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 averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 18
    Par défaut
    Merci, je vais essayer ça.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 12
    Dernier message: 15/01/2008, 16h15
  2. Réponses: 0
    Dernier message: 22/10/2007, 11h46
  3. Evenement au déchargement d'une dll par windows
    Par peijnoob dans le forum Windows
    Réponses: 3
    Dernier message: 22/06/2007, 09h54
  4. Réponses: 7
    Dernier message: 27/04/2006, 16h58
  5. Réponses: 5
    Dernier message: 08/09/2005, 20h33

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