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

x86 32-bits / 64-bits Assembleur Discussion :

API SelectObject : incompréhension du code


Sujet :

x86 32-bits / 64-bits Assembleur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 12
    Par défaut API SelectObject : incompréhension du code
    Hello,

    Le bout de code ci-dessous fonctionne bien, je n'ai aucun problème pendant son exécution, il y a quand même quelque chose qui m'interpelle :

    Les handles récupérés au début de la procédure (ligne 1-17) sont passés comme arguments à la fonction BitBlt (ligne 31 & 36). Là ou je coince dans la compréhension de ce code, c'est l'appel de la fonction SelectObject, je ne comprends pas ce qu'elle fait exactement, d'après msdn :

    This function selects an object into a specified device context. The new object replaces the previous object of the same type.

    J'ai jeté un oeil sur le contenu des registres et les segments de données avant et après l'appel de cette fonction : aucun changements. Sous olly, j'ai patché le code avec un jump de la ligne 20 à 28 pour faire un test, résultat : le bitmap ne s'affiche pas dans ma fenêtre...

    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
    push	dword hdc			; adresse PAINTSTRUCT
    push 	dword [WP1_hWnd]		; handle fenêtre
    call	[BeginPaint]
    mov	dword [hdcDestination], eax  	; on récupère le handle periph affichage
    
    ;================================================================================
    push 	dword TS1Bitmap			; adresse du bitmap			
    push	dword [hInstance]		; ID application
    call 	[LoadBitmapA]
    push	eax				; on sauvegarde le handle du bitmap
    ;================================================================================									
    push 	dword [hdcDestination]		; on passe le handle bitmap et le
    					; handle périph d'affichage 
    					; comme arguments à la fonction
    					; createCompatibleDC				
    call 	[CreateCompatibleDC]
    mov 	dword [hdcSource], eax		; on récupère le handle  periph mémoire
    ;================================================================================
    
    ]push	dword [hdcSource]		; arg=handle periph mémoire et bitmap
    					; (déjà empilé à la ligne 12)
    call	[SelectObject]			; ???			
    
    ;================================================================================
    ; BitBlt : transfère un bloc de données couleurs vers un rectangle de pixel
    ; à partir d'un périph source spécifié vers un périph destination
    ;================================================================================
    push	dword 00CC0020h			; arg fonction
    push	dword 0h			; arg fonction
    push	dword 0h			; arg fonction
    push	dword [hdcSource]		; handle de périph mémoire 
    push 	dword 39			; arg fonction
    push 	dword 100			; arg fonction
    push	dword 0h			; arg fonction
    push	dword 0h			; arg fonction
    push	dword [hdcDestination]		; handle pérpiph affichage
    call	[BitBlt]			; et on appele la fonction BitBlt
    
    ;================================================================================
    
    push	dword [hdcSource]		; suppression des handles obsolètes
    call	[DeleteDC]			; et fin de routine			
    pop		eax
    push 	eax
    call	[DeleteObject]
    push	dword hdc
    push	dword [WP1_hWnd]
    call	[EndPaint]
    Si quelqu'un pouvait m'éclairer...

    Merci d'avance.

  2. #2
    Membre chevronné
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Par défaut
    Je n'ai jamais essayé de comprendre comment SelectObject faisait son travail, encore moins essayé de désassembler son implémentation, mais à mon sens l'essentiel de son fonctionnement se passe en dehors de ton processus, là où est implémenté le GDI (serait-ce csrss??? je l'ignore).

    Ce que fait SelectObject, dans ton cas, c'est simplement remplacer l'image courante par une autre image, sur le périphérique identifié par le hdc que tu lui passes en paramètre.
    Sachant que tu ne manipules que des handles et jamais les données elles-même, je ne vois pas pourquoi qqchose devrait changer dans ton processus.
    Par contre GDI a dû tenir compte de ton appel et mettre à jour son état interne.

Discussions similaires

  1. petite incompréhension de code
    Par jackall dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 13/08/2008, 07h51
  2. Réponses: 42
    Dernier message: 19/06/2007, 09h40
  3. Réponses: 1
    Dernier message: 04/12/2006, 07h55
  4. [POO] incompréhension de code (avec Net_ping)
    Par mullger dans le forum Langage
    Réponses: 2
    Dernier message: 20/11/2006, 10h14
  5. [Recherche]une API pour colorer le code source
    Par kedare dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 31/07/2006, 08h48

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