[R] Aide sur DllCall

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
DimVar
Niveau 10
Niveau 10
Messages : 870
Enregistré le : ven. 30 mai 2008 15:08
Status : Hors ligne

[R] Aide sur DllCall

#1

Message par DimVar »

Bonjour à toutes et tous.

Dans le cadre d'un controle sur un prtscreen effectué plus haut dans un script, je souhaiterais afficher le BMP grace à la fonction "images et telecopie windows" (l'outil par defaut de visualisation d'images)

J'ai comme infos :
- qu'il s'agit de la dll : shimgvw.dll
- Que la fonction est : ImageView_Fullscreen

J'ai donc envisagé comme script :

Code : Tout sélectionner

Local $dll = DllOpen ("shimgvw.dll")
DllCall ($dll, "int","ImageView_Fullscreen")
J'ai précisé comme 2e parametre "int" sans vraiment savoir de quoi il s'agit. (je l'ai pompé sur un script d'exemple)

Mais je ne comprends pas trop la syntaxe et les parametres à mettre pour DLLCALL.
Notament l'emplacement du fichier *.BMP.

Merci de votre aide.
Modifié en dernier par DimVar le ven. 26 déc. 2008 11:42, modifié 3 fois.
N'évoquons pas la pierre, les jeunes risqueraient d'en poire !
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 sur DllCall

#2

Message par Tlem »

Pour répondre à votre question, il faut déjà maitriser l'appel des fonctions d'une Dll (ce qui est loin d'être mon cas ;) )

Ce que je peut vous donner comme infos :
  • - Il vous faut la documentation de la fonction (type de variables en entrée et en sortie ...)
    - Lire l'utilisation de la fonction DllCall :

    Code : Tout sélectionner

    DllCall ( "dll", "return type", "function" [, "type1", param1 [, "type n", param n]] )
    - dll = le chemin + le nom de la Dll, ou le handle de celle-ci obtenu par un DllOpen.
    - Return type = Le type de valeur de retour. Généralement Int pour un entier 32Bits sensé représenté le résultat de l'exécution de la fonction. Parfois peut renvoyer une chaine ou autre.
    - function = Le nom de la fonction (de la Dll) à utiliser. Peut être remplacé par sa valeur ordinal (voir outil de visualisation des fonction d'une Dll)
    - type1/param1 = Type de paramètre et 1er paramètre envoyé à la fonction.
    - type n/param n = Étant les n types et paramètres suivant.
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
DimVar
Niveau 10
Niveau 10
Messages : 870
Enregistré le : ven. 30 mai 2008 15:08
Status : Hors ligne

Re: [..] Aide sur DllCall

#3

Message par DimVar »

Merci pour ces infos :wink:

Voici une alternative que j'ai trouvé mais je laisse le topic ouvert pour l'instant.

Code : Tout sélectionner

Run ("rundll32.exe c:\windows\System32\shimgvw.dll,ImageView_Fullscreen C:\windows\photo.jpg")
N'évoquons pas la pierre, les jeunes risqueraient d'en poire !
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..] Aide sur DllCall

#4

Message par sylvanie »

une dll est une compilation visant à mettre à disposition des fonctions.
Pour les appeler, il faut donc connaître les API de ces dernière (ou prototype)
En tapant shimgvw api dans google, on tombe assez vite sur ceci :
http://www.reactos.org/pipermail/ros-de ... 10364.html

En gros les fonctions offertes sont :
VOID ImageView_Fullscreen(HWND hwnd, HINSTANCE hInst, LPCWSTR path, int nShow);
VOID ImageView_FullscreenA(HWND hwnd, HINSTANCE hInst, LPCSTR path, int nShow);
VOID ImageView_FullscreenW(HWND hwnd, HINSTANCE hInst, LPCWSTR path, int nShow);
VOID ImageView_PrintTo(HWND hwnd, HINSTANCE hInst, LPCWSTR path, int nShow);
VOID ImageView_PrintToA(HWND hwnd, HINSTANCE hInst, LPCSTR path, int nShow);
VOID ImageView_PrintToW(HWND hwnd, HINSTANCE hInst, LPCWSTR path, int nShow);
VOID ImageView_fullscreenW(HWND hwnd, HINSTANCE hInst, LPCWSTR path, int nShow);


Dans le cas de ImageView_Fullscreen, le type de retour n'est pas un int mais un void, ou plutôt none dans le langage autoit, après dans DLLCALL, on doit passer chaque paramètre dans l'ordre de l'API en précisant à chaque fois type, param :
"HWND",$hwnd,"ptr",$hInst,"wstr",$path,"int",$nShow
La difficulté maintenant va être de trouver de quel handle on parle pour $hwnd (je sens bien l'handle windows de la fenêtre en cours), $hInst pourait être l'handle de la zone graphique à remplir, $path c'est surement le fichier image, et $nShow un paramètre d'affichage à déterminer. Bon courage ^^
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..] Aide sur DllCall

#5

Message par sylvanie »

Et voilà ! Après moultes recherches et tripatouillage, voici comment utiliser cette fonction sans passer par la rundll32 : (j'ai laissé en commentaire le script VB que j'ai trouvé avec commentaires de la personne) :
► Afficher le texte

C'est franchement plus long, compliqué, mais on n'est pas passer par un Run de rundll32, parce qu'on est des grands d'abords ^^
On a gagné, on a gagné
(oui, bon ça fait des heures que j'essaie, je m'autorise un petit pétage de plomb :P )
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
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 sur DllCall

#6

Message par Tlem »

Whhaaouuuu ...
Quand même !!!

Je pense que DimVar va rester sur l'appel à Rundll32. :lol:
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é".
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

Re: [..] Aide sur DllCall

#7

Message par ani »

:)


Le hwnd = n'importe quel fenetre (là ou se trouve l'image)
l'instance = c'est la fenetre shimgvw (handle)

heureusement que le script ne comporte pas d'appel a la structure ^^'

Code : Tout sélectionner

$Image = "u.bmp"
ImageView_Fullscreen($Image)

Func ImageView_Fullscreen($sImage)
local $ret = DllCall("shimgvw","none","ImageView_Fullscreen","HWND",0,"ptr",0,"wstr",$sImage,"int",@SW_SHOW)
Return $ret
EndFunc

Pour les divers paramètre faut voir (je visionne reactos)
Avatar du membre
DimVar
Niveau 10
Niveau 10
Messages : 870
Enregistré le : ven. 30 mai 2008 15:08
Status : Hors ligne

Re: [..] Aide sur DllCall

#8

Message par DimVar »

Merci Sylvanie, merci Ani ! :D

Je pense avoir toutes les billes pour me dépatouiller.
Cela dit, je préfère quand même passer par un dllcall que par un Run de rundll32.
Y a t il des risques (connus) en faisant appel à Run et aux commandes Windows ?

@Sylvanie et Ani :
Connaitriez vous la difference, dans l'exemple que cite Sylvanie, entre :

ImageView_Fullscreen
ImageView_FullscreenW
ImageView_FullscreenA
N'évoquons pas la pierre, les jeunes risqueraient d'en poire !
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 sur DllCall

#9

Message par Tlem »

Le gros problème de la solution de ani, c'est que le script reste 'prisonnier' de l'appel à la Dll.
Temps que la fenêtre de visualisation de l'image n'est pas fermée, le script est en pause. :shock:
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
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Aide sur DllCall

#10

Message par Tlem »

Il est possible de faire ceci :

Code : Tout sélectionner

Run(@AutoItExe & ' /AutoIt3ExecuteLine  "DllCall(''' & @SystemDir & '\shimgvw.dll ' & ''',''' & "none" & _
''',''' & "ImageView_Fullscreen" & ''',''' & "HWND" & ''',0,''' & "ptr" & ''',0,''' & "wstr" & ''',''' & _
"C:\Wallpaper1.bmp" & ''',''' & "int" & ''',''' & @SW_SHOW & ''')"')
mais bon, je ne suis pas convaincu que ce soit plus simple que l'appel par rundll32.exe. :roll:
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é".
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

Re: [..] Aide sur DllCall

#11

Message par ani »

a bein oui je n'avais pas fait attention tlem.

@dimvar
la difference entre W et A => c'est unicode et ainsi

si tu remarque, y a une fonction en double chez reactos VOID ImageView_fullscreenW (en minuscule)

le lien du path peut-etre au format Ainsi ou Unicode (dans la plupart des bibliotheque (dll) il y a une fonction pour ce format ou pour l'autre) c'est ce parametre si qui permet de vérifier wstr image ou str image

attendont l'avis des experts ;)
Répondre