[R] Aide pour les DLLs

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Derou
Niveau 1
Niveau 1
Messages : 9
Enregistré le : dim. 22 mars 2009 23:39
Status : Hors ligne

[R] Aide pour les DLLs

#1

Message par Derou »

Bonjour.
J'essai de faire un programme mais je ne comprend pas bien comment fonctionnent les DLLs.

Alors, pour utiliser FTP.au3, il faut charger une DLL. Mais elle n'est pas envoyée à aucune fonction, ce qui est super étrange! Pourquoi la charger, si c'est pour ne pas l'utiliser? Est-ce que le nom $dllhandle est obligatoire?

Voici comment je charge et ferme les DLL:

Code : Tout sélectionner

; Ouverture des DLLs
Global $dlluser = DllOpen("user32.dll")
Global $dllhandle = DLLOpen("wininet.dll")

; Fermeture des DLLs
DLLClose($dlluser)
DLLClose($dllhandle)
Merci de vos explications.
Modifié en dernier par Derou le mar. 24 mars 2009 21:41, modifié 1 fois.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Aide pour les DLLs

#2

Message par orax »

Pour appeler une fonction dans une DLL vous utilisez DllCall(NOM_DU_FICHIER.DLL ou HANDLE, ...)

Soit :

Code : Tout sélectionner

; Ouverture des DLLs
Global $dllhandle = DLLOpen("wininet.dll")

DllCall($dllhandle, ...)

; Fermeture des DLLs
DLLClose($dllhandle)
ou

Code : Tout sélectionner

DllCall(NOM_DU_FICHIER.DLL, ...)
Il me semble qu'il est plus intéressant d'utiliser DLLOpen(), et de garder le handle ouvert, si vous comptez appeler la même DLL plusieurs fois (mais je ne suis pas totalement sûr de ça).

Quant au FTP.au3, je ne l'ai pas visiblement donc je ne peux pas vous répondre.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Aide pour les DLLs

#3

Message par Tlem »

Derou a écrit :je ne comprend pas bien comment fonctionnent les DLLs.
Pour plus de détails sur les dll, allez faire un tour ici, ce sera un bon début. ;)

En ce qui concerne l'utilisation d'une DLL, le but est d'y faire appel soit à la volée DllCall ( "Madll.dll", ... mais dans ce cas la DLL est chargée puis déchargée (ce qui lors de multiples appel à celle-ci n'est pas trop recommandé).
Sinon comme vous le citez, le plus simple est d'ouvrir un handle d'appel à cette DLL (on charge la DLL et on la garde chargée tant qu'on en à besoin).
Ensuite et ensuite seulement vous pouvez faire appel à une des fonctions de celle-ci.

En l'occurrence, pour l'UDF FTP.au3 dans la fonction _FTPOpen :

Code : Tout sélectionner

Func _FTPOpen($s_Agent, $l_AccessType = 1, $s_ProxyName = '', $s_ProxyBypass = '', $l_Flags = 0)
    
    Local $ai_InternetOpen = DllCall('wininet.dll', 'hwnd', '[b]InternetOpen[/b]', 'str', $s_Agent, 'long', $l_AccessType, _
                        'str', $s_ProxyName, 'str', $s_ProxyBypass, 'long', $l_Flags)
    If @error OR $ai_InternetOpen[0] = 0 Then
        SetError(1)
        Return 0
    EndIf
        
    Return $ai_InternetOpen[0]
    
EndFunc ;==> _FTPOpen()
Ici la DLL wininet est ouverte à la volée pour pouvoir utiliser la fonction InternetOpen qu'elle contient.
L'appel à une DLL, répond à des critères bien précis. Il vous faut impérativement la documentation de celle-ci pour savoir quel sont les valeurs d'entrée et de sortie.
Si vous omettez ou si vous vous trompez sur le type de valeur à passer à la DLL en argument, celle-ci vous renverra inévitablement une erreur.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Derou
Niveau 1
Niveau 1
Messages : 9
Enregistré le : dim. 22 mars 2009 23:39
Status : Hors ligne

Re: [..] Aide pour les DLLs

#4

Message par Derou »

Donc si je récapitule...
Le fait d'ouvrir ma DLL dans une variable au début de mon script évite de charger et de décharger plusieurs fois celle-ci. Donc si ma DLL a été ouverte de cette façon, DllCall ne rechargera pas la DLL mais ira simplement lire dedans. Mais si ma DLL n'est pas chargée au début du script, et que j'utilise DllCall, la DLL sera chargée et déchargée plein de fois durant l'éxécution du programme.

Ai-je bien compris?
Et pour le nom de la variable, est-il obligatoire de le laisser tel quel?

Merci!
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Aide pour les DLLs

#5

Message par Tlem »

On va dire que c'est à peut prêt ça, car la DLL ne sera chargée puis déchargée qu'au moment de l'appel au DllCall, alors que le DllOpen permet de garder ouvert la DLL le temps du traitement (c'est à dire jusqu'au moment ou vous faites un DllClose). :wink:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Derou
Niveau 1
Niveau 1
Messages : 9
Enregistré le : dim. 22 mars 2009 23:39
Status : Hors ligne

Re: [..] Aide pour les DLLs

#6

Message par Derou »

D'accord merci beaucoup. :)
Répondre