Page 1 sur 1

[R] Aide sur DllCall

Posté : mar. 18 nov. 2008 09:44
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.

Re: [..] Aide sur DllCall

Posté : mar. 18 nov. 2008 12:35
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.

Re: [..] Aide sur DllCall

Posté : mar. 18 nov. 2008 16:37
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")

Re: [..] Aide sur DllCall

Posté : mar. 18 nov. 2008 21:14
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 ^^

Re: [..] Aide sur DllCall

Posté : mar. 18 nov. 2008 23:00
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 )

Re: [..] Aide sur DllCall

Posté : mar. 18 nov. 2008 23:56
par Tlem
Whhaaouuuu ...
Quand même !!!

Je pense que DimVar va rester sur l'appel à Rundll32. :lol:

Re: [..] Aide sur DllCall

Posté : mer. 19 nov. 2008 10:31
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)

Re: [..] Aide sur DllCall

Posté : mer. 19 nov. 2008 11:39
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

Re: [..] Aide sur DllCall

Posté : mer. 19 nov. 2008 14:17
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:

Re: [..] Aide sur DllCall

Posté : mer. 19 nov. 2008 15:36
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:

Re: [..] Aide sur DllCall

Posté : jeu. 20 nov. 2008 01:55
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 ;)