Question [Résolu] Utilisation des DLL Windows
- sokai
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 17
- Remerciements reçus 0
Je n'arrive pas à trouver un tuto ou un site qui explique en détails comment utiliser les DLL windows comme User32.dll avec powershell.
Je voudrais savoir comment faire pour lister les fonctions/méthodes de ces DLL et ensuite comprendre comment faire appelle aux fonctions/méthode contenues dans ces DLL avec powershell.
Si quelqu'un à ça sous la main...
Ou en peu de temps pour des explications...
Merci d'avance.<br><br>Message édité par: Arnaud, à: 17/01/11 09:02
Connexion ou Créer un compte pour participer à la conversation.
- Arthur
- Hors Ligne
- Membre elite
-
- Messages : 226
- Remerciements reçus 0
Pour ca faut passer par du code C# ou VB.net et le compiler sur Powershell un peu dans ce genre :
powershell-scripting.com/index.php?optio...iew=flat&catid=6
ou cherche API Windows Powershell sur google.
Sinon Laurent a développé quelques fonctions :
projets.developpez.com/projects/50/wiki/Function_Invoke-Win32
www.powershell-scripting.com/index.php?o...id=3156&catid=14
Tuto pour utiliser l'API windows en dotnet :
www.codeproject.com/KB/cs/c__and_api.aspx
www.c-sharpcorner.com/UploadFile/shrijee...5528AM/win32api.aspx
Message édité par: bilbao, à: 4/01/11 18:20<br><br>Message édité par: bilbao, à: 4/01/11 19:11
Connexion ou Créer un compte pour participer à la conversation.
- sokai
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 17
- Remerciements reçus 0
Une fois les fonctions Win API accessibles, comment puis-je créer un pointeur sur une fonction pour le 4ème paramètres de l'exemple qui suit ?
UINT_PTR WINAPI SetTimer(
__in_opt HWND hWnd,
__in UINT_PTR nIDEvent,
__in UINT uElapse,
__in_opt TIMERPROC lpTimerFunc
);
De plus comment connaître exactement à quoi correspond les HWND, UINT, TIMERPROC, SHORT, DWORD etc... en powershell
Connexion ou Créer un compte pour participer à la conversation.
- Arthur
- Hors Ligne
- Membre elite
-
- Messages : 226
- Remerciements reçus 0
Une fois les fonctions Win API accessibles, comment puis-je créer un pointeur sur une fonction pour le 4ème paramètres de l'exemple qui suit ?
Bonne question...
Je te conseil de mettre NULL.
sinon pour utiliser TimerProc regarde la :
www.codeproject.com/KB/cs/ftwin32timers.aspx
Mais en réfléchissant vite fait je trouve que ca complique sérieusement tout.
Si j'ai bien tout saisi il faut créer une \"TimerProc callback function\" seulement powershell ne le fait pas(il me semble).
Si tu veux pour le \"fun\" utiliser quand même l'API, tu peux essayer de tout coder en C#, par exemple une méthode timer qui appelle une fonction Powershell à la fin.(je sait pas si je m'exprime bien, difficile à expliquer
Pourquoi ne pas tout simplement utiliser le timer dans .Net ou la cmdlet \"Start-sleep\" et si besoin est, créer un event pour appeler une fonction.
De plus comment connaître exactement à quoi correspond les HWND, UINT, TIMERPROC, SHORT, DWORD etc... en powershell ?
Regarde ici :
www.codegod.de/webappcodegod/Win32APIViewer.aspx?api=SetTimer
Si tu as besoin je peux t'expliquer un peu plus en détail l'utilisation de SetTimer en C#. (
En tous cas, ca à l'air intéressant, je regarderai plus en détails cette fonction dans les prochains jours.
EDIT: il serait bon de préciser dans quel but/contexte tu veux utiliser SetTimer.<br><br>Message édité par: bilbao, à: 5/01/11 01:16
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
sokai écrit:
Je ne pense pas que cela n'est pas possible.comment puis-je créer un pointeur sur une fonction
sokai écrit:
Quelques liens ici :De plus comment connaître exactement à quoi correspond les HWND, UINT, TIMERPROC, SHORT, DWORD etc... en powershell
?
projets.developpez.com/projects/add-lib/...WindowsFunctions.ps1
Lorsque j'ai portée ces APIs je me suis aussi aidé du code sources Delphi, pour vérifier la taille de chaque type. Les header C (*.h) sont aussi important (livrés avec le sdk Windows). Et puis [url=Médinoc
]Medinoc[/url], contributeur d'un forum Win32, m'a bien aidé.
Ensuite il y a qq types que PS ne gére pas ou mal, les entier non signé je crois.
Enfin le gros pb du portage des API sous PS est que tu ne peux pas utiliser Get-LastWin32Error, en tout cas pas avec de le code que j'utilisais.
Le mieux est de coupler du C# (Add-Type), voir de rechercher la classe C# correspondante si elle existe, sinon WMI propose également des timers.
Tu touches une des limites de PS...
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- blanc
- Hors Ligne
- Membre senior
-
- Messages : 54
- Remerciements reçus 0
sans prétendre quoi que ce soit...
Et pour le cas très particulier d'un timer dans un script powershell.
J'ai utilisé une \"form\" générée avec primalform(free) pour gérer un petit automatisme d'installation avec un timer. Dans les grandes lignes (extrait de mon code de nouilles), ca donne ceci :
[code:1]
[void] [System.Reflection.Assembly]::LoadWithPartialName(\"System.windows.forms\"«»)
# les constantes des états en cours
$Etat= new-object system.collections.hashtable
$Etat.add(\"TestInitialMstsc\", 0)
$Etat.add(\"TestPing\", 10)
$Etat.add(\"ReDemarreVM\", 20)
# la variable etat
$script:etatEnCours=$Etat.TestInitialMstsc
#region Make the form
$frmMain = new-object Windows.Forms.form
$frmMain.Size = new-object System.Drawing.Size @(800,600)
$frmMain.text = \"Connexion à la machine virtuelle\"
#intercepteur de clavier pour l'appui
$FrmMain.KeyPreview = $True
$FrmMain.Add_KeyDown({
# pour activer les logs...
if ($_.alt -and $_.KeyCode -eq \"F1\" ) {$script:modeLog=$true; $script:«»DateDebutLog=get-date; $slMessage.BackColor=\"red\";$script:LogSizeMax = 10000000}
})
#
# Timer
#
$timer = new-object System.Windows.forms.timer
$timer.Interval = 1000
# progressBar1
#
$progressBar1 = new-object System.Windows.Forms.ProgressBar
# je ne sais pas faire moins sur l'axe des Y car picturebox réserve la place.
$progressBar1.Location = new-object System.Drawing.Point($(Xmult(300)), $(Ymult(420)))
$progressBar1.Name = 'progressBar1'
$progressBar1.Size = new-object System.Drawing.Size(190, 20)
$progressBar1.Value = 0
$progressbar1.style = 'continuous'
$progressbar1.step = 1
#
# statusStrip1
#
$statusStrip = new-object System.Windows.Forms.StatusStrip
$statusStrip.Location = new-object System.Drawing.Point(0, 310)
$statusStrip.Name = \"statusStrip\"
$statusStrip.Size = new-object System.Drawing.Size(150, 22);
$statusStrip.TabIndex = 1
$statusStrip.Text = \"statusStrip\"
#
# ajout des controls dans la Form1
#
$frmMain.Controls.Add($label1)
$frmMain.Controls.Add($progressBar1)
#
# la fct automate appelée par le timer
#
function script:testConnexion ($index){
switch ($script:etatEnCours){
{ $_ -eq $Etat.TestInitialMstsc } {
#logger \"`t--> TestInitialMstsc...$_\"
}
{ $_ -eq $Etat.TestPing } {
#logger \"`t--> Test Ping...$_ `$script:Cpt = $script:Cpt\"
}
# ...
}#fin du switch
}#fin de function
#
# la fct TIMER automate
#
$script:i=1
$timer.Add_Tick({
# on teste si la vm est prête à recevoir la commande mstsc pour ne pas avoir la msgbox d'erreur de mstsc
testConnexion $script:i
}) # fin scriptblock timer
$label1.Text = 'Installation en cours ...'
$timer.Start()
$FrmMain.Add_Shown({$FrmMain.Activate()})
[void]$FrmMain.showdialog()
[/code:1]
Juste pour montrer le cas du timer avec dot.net disponible depuis PS.
Le ...add_tick({...}) ne s'invente pas (faut lire les incontournables documents de Laurent Dardenne et de Janel, c'est long !)
Peut être à côté du besoin ...
Ps : Attention aux \"ré-entrances\" si une action est plus longue que le timer (faire stop et start timer dans la fct si besoin), y a des effets surprenants.
Cela peut être une piste pour éviter les callback impossibles, la seule que j'ai trouvé à ce jour.
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les initiés
- [Résolu] Utilisation des DLL Windows