From Friday, April 19th (11:00 PM CDT) through Saturday, April 20th (2:00 PM CDT), 2024, ni.com will undergo system upgrades that may result in temporary service interruption.

We appreciate your patience as we improve our online experience.

Discussions au sujet de NI LabVIEW

annuler
Affichage des résultats de 
Rechercher plutôt 
Vouliez-vous dire : 

Fermeture Labview à cause de DLL

Résolu !
Accéder à la solution

Bonjour à tous,

 

Je souhaite fermer la calculatrice windows grâce à Labview, j'ai alors suivi le topic ci dessous.

 

http://forums.ni.com/t5/Discussions-de-produit-de-NI/fermeture-d-un-programme-lancer-avec-un-bat/m-p...

 

Alors cela fonctionne très bien au detail près que Labview se ferme aussi. Cependant aucun autre logiciel à part la calculatrice et Labview.

Je vous joins mon VI.

 

Merci d'avance.

 

Bon week end

 

 

0 Compliments
Message 1 sur 6
3 021 Visites
Solution
Accepté par l'auteur du sujet Benji88_74

Dans la configuration de la fonction "SendMessage" (à droite)

va voir dans Configure/Fonction/Calling convention .... tu as mis "C", pas bon ça ... c'est "stdcall WINAPI"

 

avec la convention "C" les paramètres ne sont pas passés dans le même ordre.

En fait ... tu fermais bien la calculatrice ... et ensuite tu crashais LV.

 

Accessoirement, pour la fonction FindWindow, pour IpszClassName, tu as mis un I32 ... c'est un U32 qu'il faut.

(mais ça, c'est moins grave)

 

et encore accessoirement ... oui, c'est bien 16 qu'il faut mettre ...0x10 en hexa

mais cela ne correspond pas à un WM_QUIT, mais à un WM_CLOSE.

(WM_QUIT, c'est 0x12)

Message 2 sur 6
3 017 Visites

voici un exemplaire qui fonctionne

 

original5.png

0 Compliments
Message 3 sur 6
3 009 Visites

Merci de ra réponse. C'est effectivement cela.

 

Pourrais tu me dire la différence entre le choix du code C et de stdcall WINAPI (je suppose que cela vient de la manière dont est codé la DLL) ?

 

En tout cas encore merci !

 

Benjamin

0 Compliments
Message 4 sur 6
2 998 Visites

Il y a 2 grandes conventions d'appel d'une fonctions.

celle utilisée en C, soit aussi appelée la convention "__cdecl"

et celle utilsée pour l'appel des fonctions WIN32 API, aussi appelée "__stdcall"

 

Pour appeler une fonction, il faut (en général) passer des arguments.

Cela se fait via la Pile

 

push arg_1     (dword - 32bits)

push arg_2     (dword - 32bits)

call fonction

 

Quand tout est terminé, il faut ré-équilibrer la Pile. (la Pile va du haut vers le bas, c'est une FIFO)

 

Avec la convention _cdecl (C), c'est la code appelant qui rétabli la PIle.

 

       push arg_1

       push arg_2

       call fonction

              add    esp,8         // 8=2*4 ... 4: 4 bytes = 4*8 = 32bits

                                        // add esp,8 ... ou ... pop arg_2,pop arg_1

              la suite

-----------------------------------------

fonction:  ma fonction

              .....

              ret

-----------------------------------------

 

Avec la convention __stdcall (WINAPI), c'est la fonction appelée elle-même qui rétabli la Pile.

 

       push arg_1

       push arg_2

       call fonction

       la suite

 -----------------------------------------

fonction:  ma fonction

              .....

              ret       8              // ret 8 = ret ... et ensuite ... add esp,8

-----------------------------------------

 

Difficile d'expliquer davantage sans plonger dans le langage Assembleur

et les instructions processeurs elles-mêmes.

 

Message 5 sur 6
2 996 Visites

me suis trompé.

La Pile des processeurs, ce n'est pas une Pile FIFO, mais LIFO (Last IN First Out)

0 Compliments
Message 6 sur 6
2 974 Visites