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

C# Discussion :

Delegate et Pointeur de fonction


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2010
    Messages : 12
    Points : 12
    Points
    12
    Par défaut Delegate et Pointeur de fonction
    Bonjour à tous,

    J'ai un souci de cast, semble t-il.
    mon but est de 'faire rentrer' une adresse de fonction dans un pointeur : créer un pointeur de fonction. pour adresser la fonction, j'ai bien cru comprendre qu'il faut utiliser un delegate... et je ne parviens pas à le caster ensuite en IntPtr.

    voici un extrait de code, pour illustrer un peu le contexte:
    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
    public delegate IntPtr MyFunction(IntPtr hInstance, IntPtr lpTemplateName,
                IntPtr hWndParent, IntPtr lpDialogFunc, IntPtr dwInitParam);
     
    public static void Hook()
    {
        byte[] TmpBytes = new byte[5];
     
        MyFunction myFct = new MyFunction(MyNewFunction);
        MoveMemory((IntPtr)TmpBytes[1], (IntPtr)myFct, 4);  /* ... pb de cast avec myFct*/
    }
     
    static IntPtr MyNewFunction(IntPtr hInstance, IntPtr lpTemplateName,
                IntPtr hWndParent, IntPtr lpDialogFunc, IntPtr dwInitParam)
    {
    }
    ça coince au second argument de MoveMemory, où l'api attend nominalement un IntPtr.
    comment convertir myFct en IntPtr ?
    faut-il vraiment utiliser un delegate? j'ai bloqué de la même façon avec des pointeurs 'unsafe'. rapide et brutal . dans d'autres languages, ce genre de truc est super facile à faire...
    je fais assez peu de c#.net, et je ne sais plus trop comment faire, là, en fait..
    je pige plus.

    merci pour votre aide ou vos conseils...
    ++

  2. #2
    Membre émérite
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Points : 2 424
    Points
    2 424
    Par défaut
    j'ai trouvé ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    IntPtr unmanagedPointer = Marshal.AllocHGlobal(bytes.Length);
    Marshal.Copy(bytes, 0, unmanagedPointer, bytes.Length);
    // Call unmanaged code
    Marshal.FreeHGlobal(unmanagedPointer);
    voir lien

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2010
    Messages : 12
    Points : 12
    Points
    12
    Par défaut
    ok, ok... très très bonne piste, qui semble en plus, bien plus adaptée au language...

    ça modifie un peu le design global du code, mais j'ai confiance.
    le temps de finir quelques modifs, je teste, et je ferais un retour.

    merci beaucoup pour ta réponse!

  4. #4
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut

    Peut-on savoir pourquoi tu veux faire "entrer" ton adresse de méthode dans un IntPtr ??

    Le principe des delegate, c'est précisément de ne pas devoir te préoccuper ce ce concept de Pointeur cher au bon vieux C

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2010
    Messages : 12
    Points : 12
    Points
    12
    Par défaut
    olibara, ce que je cherche à faire :
    je 'remplace' carrément le fonctionnement d'une api, dans certains cas, sans entrer dans les détails. et je fais ça avec un MoveMemory. du pur non-managé. donc, j'importe le coup de devoir faire un pointeur de fonction.

    pour dire les choses comme elles sont... je suis bien conscient que je code en c#.net, là, mais avec un schéma en C : pas trop adapté. c'est le C qui m'a appris l'info, alors, oui, j'ai des 'automatismes'...

    je crois que je n'aurais la 'philosophie' et autres bonnes pratiques qu'à force de bloquer...
    j'apprends. ou j'essaie !!

  6. #6
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut

    Je pense justement qu'il serait bon de s'attarder dans certains détails

    J'ai eu moi meme quelques difficultée en 2008 en passant du C en Csharp
    J'avais aussi certains automatisme et quelque difficultés a les abandonner

    Mais in fine je ne regrette rien et la programmation C# est qund meme infiniment plus conviviale qu'en C ou meme C++

    J'ai aussi migré des app et des algo pur C vers C#
    Au debut j'y allais timidement en essayent de reproduire en C# les mnipulation propre au C

    Ca complique le code et ca n'apporte quasiment rien en performance, il vaut mieux simplement réecrire en suivant le concept et non le code lui meme !

    J'ai encore quelque algo tres pointu qui manipulent des bit, ceux las sont dans des DLL c auqelles je concede quelques intPtr pour le dialogue !

Discussions similaires

  1. Réponses: 5
    Dernier message: 03/10/2011, 16h20
  2. Taille d'un pointeur de fonction (delegate)
    Par yocks dans le forum C#
    Réponses: 2
    Dernier message: 13/05/2009, 10h07
  3. Matrice de pointeurs de fonctions
    Par sebduth dans le forum C
    Réponses: 15
    Dernier message: 18/07/2003, 14h03
  4. [Kylix] Pointeur de fonctions
    Par _dack_ dans le forum EDI
    Réponses: 1
    Dernier message: 03/07/2003, 10h17
  5. pointeur de fonction
    Par kardath dans le forum C
    Réponses: 4
    Dernier message: 28/12/2002, 14h39

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