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 :

Messages to delphi dll


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juillet 2008
    Messages : 71
    Points : 32
    Points
    32
    Par défaut Messages to delphi dll
    Salut tout le monde,

    J'ai développé une dll sous delphi utilisant un TTimer. La dll a besoin d'effectuer des taches toutes les n secondes.

    Si je branche cette dll via une application delphi tout se passe bien.
    Par contre, je rencontre un problème si je branche ma dll sur une application Java. L'evenement OnTimer n'est jamais exécuté. Je soupçonne un problème lié aux messages windows. Je pense que ma dll n'est jamais notifié de la réception par l'application du message WM_TIMER. Qu'en pensez vous?

    Connaissez vous une solution?

    Merci d'avance.

  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
    Ton Timer est juste à l'intérieur de la DLL, elle en fait quoi de l'évènement, elle appelle une procédure type CallBack ou alors juste un traitement interne ?

    Sinon, je répète, qu'un thread démarré avec DllEntryPoint serait plus efficace et plus maitrisable ...
    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
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juillet 2008
    Messages : 71
    Points : 32
    Points
    32
    Par défaut
    En faite, je ne gère pas l'évènement c'est le timer qui est censé le récupérer pour exécuter dans le OnTimer un traitement interne.

    Je vais développer un Timer Perso basé sur un thread qui attend et pas sur les évènements Windows.

    Quelle est l'utilité du DllEntryPoint? je ne connais pas.
    Mon timer perso sera un composant réutilisable aussi bien dans une dll que dans un exécutable...dans ces conditions dois-je utiliser DllEntryPoint?

    Merci pour ton aide.

  4. #4
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 168
    Points : 120
    Points
    120
    Par défaut
    Essay avec l'API SetTimer(...); c'est plus efficace que d'utiliser les timer de la VCL surtout pour un usage externe !

  5. #5
    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
    le DLLEntryPoint c'est lorsque tu charges la DLL, tu peux vouloir lancer le Timer dès le chargement (LoadLibrary) sans nécessairement devoir appeler une fonction ... pour le thread, t'emmerde pas cela a déjà été écrit,

    ça donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    type
      TTimerThread = class(TThread)
      private
        FDelay: Cardinal;
        FEvent: TThreadMethod;
      protected
        procedure Execute; override;
      public
        constructor Create(ADelay: Cardinal; AEvent: TThreadMethod);
     
        property Delay: Cardinal read FDelay; // en milli-secondes
        property Event: TThreadMethod read FEvent;
      end;
    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
    constructor TTimerThread.Create(ADelay: Cardinal; AEvent: TThreadMethod);
    begin
      inherited Create(True);
     
      FDelay := ADelay;
      FEvent := AEvent;     
     
      Self.Resume();
    end;
     
    procedure TTimerThread.Execute();
    begin
      while  not Terminated do
      begin
         Sleep(FDelay); // à souvent 0.95 milli-secondes de retard :mouarf:, mais tu as un besoin moins précis, il me semble
         Event();
      end;
    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

  6. #6
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juillet 2008
    Messages : 71
    Points : 32
    Points
    32
    Par défaut
    Merci à vous 2.

    0x44-0x43-0x53-0x43: SetTimer n'utilise pas les messages Windows?

    ShaiLeTroll: Merci pour toutes les infos. Je vais partir sur cette voie. J'ai également trouvé cette source qui est pas mal: http://www.gtdelphicomponents.gr/?p=178

  7. #7
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juillet 2008
    Messages : 71
    Points : 32
    Points
    32
    Par défaut
    J'ai terminé mon timer avec thread et ca marche beaucoup mieux mais voila j'ai toujours un problème avec Windows et ses évènements.

    J'utilise des objets de la VCL dans mon onTimer. Je dois donc passer par Synchronize pour l'exécuter. Synchronize utilise des évènements et ca ne marche donc pas lorsque ma dll est appelé via l'application de test java. Si je retire synchronize, j'ai des crashs!

  8. #8
    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
    Quels objets de la VCL ?
    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
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juillet 2008
    Messages : 71
    Points : 32
    Points
    32
    Par défaut
    Potentiellement n'importe lequel!
    Dans mon exemple, j'ai un TMemo, un TObjectList, un TListView...

  10. #10
    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
    un TMemo ou TListView dans une DLL, c'est étrange, ... sinon, le reste ne devrait pas poser problème ... sans ShareMem déjà ...

    C'est une DLL ou un ActiveX ?
    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

  11. #11
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juillet 2008
    Messages : 71
    Points : 32
    Points
    32
    Par défaut
    En faite, j'ai un bout de code qui contient le ontimer.

    Dans un cas, ce bout de code est utilisé directement dans une application delphi. La procedure branchée sur le ontimer contient le TMemo et TListview.

    Dans l'autre cas, ce bout de code est partagé pour générer une dll. Une application de test utilise cette dll. Le procedure de l'application branchée sur le ontimer contenu dans la dll peut contenir n'importe quoi mais pas dans la VCL.

    Par contre dans les deux cas, j'ai besoin d'un TObjectList dans mon thread.

    Dans le premier cas, j'ai besoin de synchronize sinon ca freeze.
    Dans le deuxième cas, ca ne marche pas avec le synchronize...execute se termine de manière inattendu. Si je retire le synchronize, ca marche (alors que j'utilise le TObjectList de la vcl ... bizarre? ).

    J'ai vraiment besoin que ce code soit partagé ... mais dans un cas j'ai besoin du synchronize, dans l'autre non. Et si une application delphi appel la dll et utilise la vcl dans le ontimer ... J'aurai probablement besoin du Synchronize dans ce cas la aussi. Comment puis-je gerer ce casse-tete?

  12. #12
    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
    L'autre solution, c'est de lancer la DLL elle-même dans un Thread et que ce soit l'application appelante qui fasse le Timer ...

    Sinon quel est le but de la DLL ? c'est bien tordu ton histoire
    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

  13. #13
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juillet 2008
    Messages : 71
    Points : 32
    Points
    32
    Par défaut
    La dll doit être une sorte de plugin... je ne peux pas demander à l'application hôte de gérer quoi que ce soit.

    En tout cas merci pour ton aide.

  14. #14
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    VCL: Visual Component Library

    Donc le TObjectList n'en fait pas partie
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  15. #15
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juillet 2008
    Messages : 71
    Points : 32
    Points
    32
    Par défaut
    Je sais ce que veut dire VCL mais si tu vas dans l'aide tu veras que Contnrs en fait partie ... donc TObjectList en fait partie!

  16. #16
    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
    Tu confonds la VCL et RTL ... mais comme un peu tout le monde puisque l'aide n'en fait pas la différence ...

    Sinon, que doit faire ta DLL, comment-elle invoquer ?
    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

Discussions similaires

  1. Messages dans une DLL
    Par oliver_mpt dans le forum Windows
    Réponses: 8
    Dernier message: 12/11/2008, 20h57
  2. [Delphi] [DLL] Problème avec un paramètre PChar
    Par Mickey.jet dans le forum Langage
    Réponses: 1
    Dernier message: 22/03/2006, 16h43
  3. Traduction C++/Delphi DLL et function Callback
    Par Crafton dans le forum Langage
    Réponses: 12
    Dernier message: 23/02/2006, 09h55
  4. Creation d'un message dans une dll non MFC
    Par dug dans le forum Windows
    Réponses: 1
    Dernier message: 29/11/2005, 12h50
  5. Comment intégrer un Delphi DLL dans CBuilder
    Par Xavier dans le forum C++Builder
    Réponses: 3
    Dernier message: 13/09/2005, 16h49

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