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 :

[WIN32]Subclassing de classe récalcitrant


Sujet :

API, COM et SDKs Delphi

  1. #1
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 302
    Par défaut [WIN32]Subclassing de classe récalcitrant
    bonjour,

    je rencontre le problème suivant :
    je monitore une application tiers écrite en delphi qui utilise dans une form un composant TAdvOfficePager (TMS Software).
    cette form est créée dynamiquement par une action utilisateur et plusieurs peuvent être ouvertes simultanément
    je dois détecter certaines actions sur ce contrôle, détection que j'obtiens en subclassant celui-ci.
    comme celui-ci est susceptible d'être créé un certain nombre de fois,
    j'avais naturellement pensé me simplifier la vie en subclassant la classe (SetClassLong) et non la fenêtre.
    ce subclassement s'effectue sans erreur mais je constate qu'il reste parfaitement
    inopérant pour les nouvelles fenêtres de ce contrôle
    je suppose que le constructeur doit réinitialiser la wndproc ou un truc du genre

    auriez-vous une idée sur une façon de résoudre ce problème
    sachant que je n'ai pas la main sur les sources de l'application
    et que le support de TMS est réservé aux clients enregistrés
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Bonjour,
    Citation Envoyé par omen999 Voir le message
    auriez-vous une idée sur une façon de résoudre ce problème sachant que je n'ai pas la main sur les sources de l'application
    et que le support de TMS est réservé aux clients enregistrés
    Ben, détecter chaque ouverture de ce type de fiche et subclasser chacune d'entre elles...
    Cette application est lancée dans le même thread ou dans des threads indépendants ?
    --
    Philippe.

  3. #3
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 302
    Par défaut
    Ben, détecter chaque ouverture de ce type de fiche et subclasser chacune d'entre elles...
    ça, c'est ce que je fais déjà avec en prime l'adresse de la précédente wndproc en GWL_USERDATA pour n'en avoir qu'une à gérer pour tous les subclassements
    Cette application est lancée dans le même thread ou dans des threads indépendants ?
    toutes les instances du ctrl sont dans le même thread ainsi que mon appel infructueux au subclassement de classe
    mais de toute façon, le subclassement de classe n'est pas thread-dépendant
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  4. #4
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 540
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 540
    Par défaut
    Citation Envoyé par omen999 Voir le message
    j'avais naturellement pensé me simplifier la vie en subclassant la classe (SetClassLong) et non la fenêtre.
    j'aurais fait exactement l'inverse.
    En win32 un contrôle est crée avec CreateWindow ou -Ex.
    Qu'importe le langage (Delphi,.NET..) si tu veux créer un contrôle comme une EditBox,il faut passer par CreateWindow
    Ensuite ce contrôle est géré par la WindowProcedure de la fenêtre parente qui redistribue les messages systèmes comme EM_GETLINE pour une EditBox via un WM_COMMAND.
    Par exemple si tu veux voir qu'une combobox reçoit une notification en win32
    il faut examiner le message WM_COMMAND dans la WinProc puis récupérer le ID du Contrôle puis voir si par exemple puis CBN_EDITCHANGE.

    SetClassLong n'est pas l'API appropriée : tu ne rattaches pas un pointeur à la boucle de message de la fenêtre parente
    http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
    Il faut utiliser SetWindowLong sur la procédure de fenêtre parente

  5. #5
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 302
    Par défaut
    mmm, je n'ai pas l'impression que tu as lu les messages précédents car c'est effectivement le subclassement individuel que j'utilise
    pour ce qui est de la prog win32, j'ai quelques notions sur le sujet
    la classe en window management, c'est une façon pour MS de proposer une POO rudimentaire pour créer des instances de contrôles à partir d'un modèle
    ça permet notamment le superclassing qui doit être, de mémoire, la technique utilisée par la vcl delphi pour créer des composants à partir des ctrls win32
    modifier l'adresse de la wndproc de la classe doit normalement permettre aux nouvelles instances du ctrl créé à partir de cette classe d'inclure ma wndproc perso
    malheureusement, je suppose (?) que le constructeur ne doit pas respecter l'intégrité de la chaine des wndproc en la réinitialisant à sa sauce ce qui n'est pas conforme aux règles définies par MS
    comme c'est la 1ère fois que je rencontre le problème, je me demandais s'il existait un trick quelconque sur ce sujet
    Qu'importe le langage (Delphi,.NET..)
    entièrement d'accord, c'est pourquoi j'avais hésité à poster dans le sous-forum programmation windows et je vais voir s'il est possible de déplacer le sujet (ou pas)
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  6. #6
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 540
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 540
    Par défaut
    Salut voilà des exemples en C++ à tout hasard
    http://www.codeproject.com/KB/DLL/PasswordSPY.aspx
    http://www.codeproject.com/KB/system...ying_hack.aspx
    Citation Envoyé par omen999 Voir le message
    modifier l'adresse de la wndproc de la classe doit normalement permettre aux nouvelles instances du ctrl créé à partir de cette classe d'inclure ma wndproc perso
    oui on est d'accord c'est ce que j'ai essayé d'expliquer

    sinon regarder cela
    http://msdn.microsoft.com/en-us/libr...(v=VS.85).aspx
    il ya des nouvelles fonctions de "subclassing"
    Citation Envoyé par omen999 Voir le message
    malheureusement, je suppose (?) que le constructeur ne doit pas respecter l'intégrité de la chaine des wndproc en la réinitialisant à sa sauce ce qui n'est pas conforme aux règles définies par MS
    si le composant est un Active X alors c'est que le contrôle est construit avec une autre manière.
    Peut-être que tu peux tracer en code assembleur mais c'est très fastidieux
    Citation Envoyé par omen999 Voir le message
    mmm, je n'ai pas l'impression que tu as lu les messages précédents car c'est effectivement le subclassement individuel que j'utilise
    si j'ai parfaitement bien lu mais tu ne décris pas les procédures et les étapes pas-à-pas pour essayer de résoudre le problème

  7. #7
    Membre émérite
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Par défaut
    Delphi crée une propriété sur la fiche contenant le pointeur de la fiche dont j'ai oublié le nom regarde l'unité controls, utiliser GetProp
    pour recuperer cette information et exceter une Remotethead pour faire un turuc de genre

    TForm(Lepointeur).classname

  8. #8
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 302
    Par défaut
    je déterre le sujet pour la bonne cause puisqu'il est résolu après un retour récent sur ce vieux code.
    j'ai suivi le conseil de Mat.M et utilisé les méthodes de subclassing plus récentes
    après adaptation à la mimine pour mon vieux D4 ça fonctionne nickel

    so résolu
    merci encore
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 29/05/2009, 00h17
  2. [Win32] Pointeur sur fonctions et méthodes de classe
    Par Invité dans le forum Langage
    Réponses: 4
    Dernier message: 13/09/2007, 19h07
  3. [mapping subclass dans la classe parent]
    Par mamata dans le forum Hibernate
    Réponses: 1
    Dernier message: 11/07/2007, 15h28
  4. callback Win32 dans des classes perso
    Par NiamorH dans le forum Windows
    Réponses: 12
    Dernier message: 07/01/2007, 17h47
  5. [Dev-C++] Subclassing dans une classe
    Par sas dans le forum Windows
    Réponses: 11
    Dernier message: 17/01/2005, 23h24

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