Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1674 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VB] Crash de VB en sortie de l'appli

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[VB] Crash de VB en sortie de l'appli

n°477039
skeye
Posté le 04-08-2003 à 15:26:49  profilanswer
 

Bon, j'y connais pas des masses en VB et je suis censé débugger une petite appli qui permet de tester une dll (la question risque d'être savoir si c'est le prog VB ou la dll C++ qui fait planter le brol).
C'est pas très long, je vous mets le code:

Code :
  1. Option Explicit
  2. Private m_bShow As Boolean
  3. Private Const VK_F2 = &H71
  4. Private Const VK_SHIFT = &H10
  5. Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
  6. Private WithEvents hook As CGlobalHook
  7. Private Sub Form_Load()
  8.     Set hook = New CGlobalHook
  9.     Hide
  10. End Sub
  11. Private Sub Form_Unload(Cancel As Integer)
  12.     Set hook = Nothing
  13. End Sub
  14. Private Sub hook_KeyPressed(VKCode As Long, Scancode As Long, Repeatcount As Long, ExtendedKey As Boolean, AltDown As Boolean, PrevState As Boolean, State As Boolean)
  15.     Debug.Print "VKCode = " & VKCode & ", shift is " & GetAsyncKeyState(VK_SHIFT)
  16.     If VKCode = VK_F2 And (GetAsyncKeyState(VK_SHIFT) <> 0) Then
  17.         If AltDown Then
  18.             Unload Me
  19.         Else
  20.             m_bShow = True
  21.         End If
  22.     End If
  23. End Sub
  24. Private Sub Timer_Timer()
  25.     If m_bShow Then
  26.         Call MsgBox("You pressed Shift-F2!", vbInformation + vbSystemModal, "Information" )
  27.         m_bShow = False
  28.     End If
  29. End Sub


 
Lorsque j'exécute ce machin ca fonctionne très bien, jusqu'à ce que je veuille l'arrêter...et là VB (VB6, au fait) me fait une op non conforme bla bla bla...
Je vois pas d'où ca peut venir, j'ai essayé en commentant le contenu de Form_Unload, mais ca ne change rien...

mood
Publicité
Posté le 04-08-2003 à 15:26:49  profilanswer
 

n°477066
drasche
Posté le 04-08-2003 à 15:40:48  profilanswer
 

Je dirais que ta DLL n'est pas conforme. Si elle l'était, je ne vois pas de raison pour laquelle VB planterait. A moins que ce ne soit lié à ton hook? C'est une possibilité à explorer.
 
Tout ce que je sais sur le sujet, c'est que les fonctions C appelées par VB doivent être déclarées avec __stdcall.
 
D'autre part, sans a priori sur le code de ta DLL, tu dois savoir qu'en VB, les Long et Integer sont toujours signés. Il y a donc possibilité d'une mauvaise interprétation si tu utilises du non-signé côté DLL.

n°477068
skeye
Posté le 04-08-2003 à 15:42:24  profilanswer
 

drasche a écrit :

Je dirais que ta DLL n'est pas conforme. Si elle l'était, je ne vois pas de raison pour laquelle VB planterait. A moins que ce ne soit lié à ton hook? C'est une possibilité à explorer.
 
Tout ce que je sais sur le sujet, c'est que les fonctions C appelées par VB doivent être déclarées avec __stdcall.
 
D'autre part, sans a priori sur le code de ta DLL, tu dois savoir qu'en VB, les Long et Integer sont toujours signés. Il y a donc possibilité d'une mauvaise interprétation si tu utilises du non-signé côté DLL.


ok, dans ce cas je vais regarder de plus près la dll (spa mon code non plus...j'ai juste un peu modifié...:sweat:)

n°477076
skeye
Posté le 04-08-2003 à 15:48:06  profilanswer
 

Autre question nulle: pourquoi est-ce que je vois aucune référence à ma dll dans ce putain de code??? :sweat:

n°477083
drasche
Posté le 04-08-2003 à 15:55:25  profilanswer
 

oups :D
 
tout ce que je vois, c'est ceci:

Code :
  1. Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer


 
Tu devrais regarder dans la classe CGlobalHook ;)

n°477095
skeye
Posté le 04-08-2003 à 16:01:01  profilanswer
 

drasche a écrit :

oups :D
 
tout ce que je vois, c'est ceci:

Code :
  1. Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer


 
Tu devrais regarder dans la classe CGlobalHook ;)


J'ai pas de classe CGlobalHook [:sisicaivrai].
Et tout ce que ma dll exporte c'est  

Citation :


SetHook            
RemoveHook          
CheckKey  


...qui n'apparaissent nulle part dans ce code VB de mes 2...:o
 :pt1cable:

n°477101
drasche
Posté le 04-08-2003 à 16:02:14  profilanswer
 

skeye a écrit :

J'ai pas de classe CGlobalHook [:sisicaivrai].  


si, dans ton projet VB (me suis mal exprimé je crois :whistle:)

n°477111
skeye
Posté le 04-08-2003 à 16:03:33  profilanswer
 

drasche a écrit :


si, dans ton projet VB (me suis mal exprimé je crois :whistle:)


grumpf.
Tout le code que j'ai se trouve dans mon 1er post...
Ou alors caché dans un autre rep de ce que m'a filé mon boss sans rien m'esspliker, p-e... :sweat:

n°477131
drasche
Posté le 04-08-2003 à 16:07:52  profilanswer
 

ah mais... autre supposition, t'as une référence vers un compo externe, lequel contiendrait la classe litigeuse. Va voir dans le menu Project/Reference. T'as une liste avec les librairies référencées. En tête tu as 3x Visual Basic-TrucMuche puis OLE Automation. Ces 4 là sont standard. Les autres cases cochées sont des références spécifiques à ton projet VB.

n°477164
skeye
Posté le 04-08-2003 à 16:17:16  profilanswer
 

drasche a écrit :

ah mais... autre supposition, t'as une référence vers un compo externe, lequel contiendrait la classe litigeuse. Va voir dans le menu Project/Reference. T'as une liste avec les librairies référencées. En tête tu as 3x Visual Basic-TrucMuche puis OLE Automation. Ces 4 là sont standard. Les autres cases cochées sont des références spécifiques à ton projet VB.


Bon, j'ai retrouvé globalHook (il était bien dans les références, et j'ai aussi les sources).
Ca donne ça:

Code :
  1. Option Explicit
  2. Event KeyPressed(VKCode As Long, _
  3.                  Scancode As Long, _
  4.                  Repeatcount As Long, _
  5.                  ExtendedKey As Boolean, _
  6.                  AltDown As Boolean, _
  7.                  PrevState As Boolean, _
  8.                  State As Boolean)
  9. Friend Sub ProcessKeyStroke(VKCode As Long, Flags As Long)
  10.     Dim Scancode As Long
  11.     Dim Repeatcount As Long
  12.     Dim ExtendedKey As Boolean
  13.     Dim AltDown As Boolean
  14.     Dim PrevState As Boolean
  15.     Dim State As Boolean
  16.    
  17.     Scancode = Flags And &HFFFF          ' bits 0 .. 15
  18.     Repeatcount = Flags And &HFF0000     ' bits 16 .. 23
  19.     ExtendedKey = Flags And &H1000000    ' bit 24
  20.     AltDown = Flags And &H20000000       ' bit 29
  21.     PrevState = Flags And &H40000000     ' bit 30
  22.     State = Flags And &H80000000         ' bit 31
  23.    
  24.     RaiseEvent KeyPressed(VKCode, Scancode, Repeatcount, ExtendedKey, AltDown, PrevState, State)
  25. End Sub
  26. Private Sub Class_Initialize()
  27.     Set MCallback.m_GlobalHook = Me
  28.     SetGlbHook
  29. End Sub
  30. Private Sub Class_Terminate()
  31.     UnSetGlbHook
  32.     Set MCallback.m_GlobalHook = Nothing
  33. End Sub


Je vois pas de truc abracadabrant...à part ces affreux masques hexa, mais bo je suppose l'auteur sait ce qu'il fait! :sweat:  
(Toujours pas de référence à ma dll c++, par contre...magique tout ça... :pt1cable: )

mood
Publicité
Posté le 04-08-2003 à 16:17:16  profilanswer
 

n°477173
drasche
Posté le 04-08-2003 à 16:21:12  profilanswer
 

doit manquer quelque chose car tu as un MCallback utilisé dans les Initialize et Terminate (constructeur et destructeur en VB) mais déclaré nulle part, il s'agit donc d'une variable globale. Si tu as le curseur dessus, tu fais un Shift-F2 et tu atterriras sur la déclaration (View/Definition si tu préfères par le menu).

n°477189
skeye
Posté le 04-08-2003 à 16:28:23  profilanswer
 

drasche a écrit :

doit manquer quelque chose car tu as un MCallback utilisé dans les Initialize et Terminate (constructeur et destructeur en VB) mais déclaré nulle part, il s'agit donc d'une variable globale. Si tu as le curseur dessus, tu fais un Shift-F2 et tu atterriras sur la déclaration (View/Definition si tu préfères par le menu).


Trouvé...mais aussi trouvé un fichier texte qui donne un lien vers l'endroit ou mon boss doit avoir trouvé tout ce bordel:
http://www.Planet-Source-Code.com/ [...] 5&lngWId=1
Commentaire:

Citation :


The crashing is because VB  
does not cleanly ends the code when you  
use the (manque la fin!)


puis

Citation :


You  
must NOT use the stop button in the IDE  
or the "END" statement. If you unload  
all forms nicely (or set the hook  
variable to Nothing), all should be  
just fine.


Résultat, je dis à mon chef de se démerder avec ça? :ange:

n°477210
skeye
Posté le 04-08-2003 à 16:43:12  profilanswer
 

[:volta]  
Mon boss va se démerder avec cette erreur à la con tout seul! [:ddr555]
Merci quand même!:jap:

n°477228
drasche
Posté le 04-08-2003 à 16:54:49  profilanswer
 

la suite du commentaire était en dessous mais formulée autrement [:ddr555]
 
et effectivement, dès que t'as des hooks, du subclassing et compagnie, faut éviter d'appuyer sur Stop. Celui-ci cleane tout à sa manière mais plus aucun code VB n'est exécuté, dont celui qui est en charge du release du hook, d'où le plantage.

n°477658
karlkox
Posté le 05-08-2003 à 00:11:39  profilanswer
 

Une "technique" lorsque l'on fait du subclassing c'est de s'envoyer le message WM_QUIT lors de l'unload de la form.
Une autre "technique" consiste à récupérer l'adresse de la fonction de hook/subclassing et de l'arreter via SetWindowLong(hwnd, GWL_WNDPROC, adresse_WindowProc) et d'ensuite envoyer le message WM_QUIT.
Ces deux "techniques" fonctionnent chez moi.

n°477876
drasche
Posté le 05-08-2003 à 11:48:08  profilanswer
 

oui mais pour cela il faut que le code VB soit exécuté. Si le bouton Stop est pressé comme c'est très probablement son cas, aucun code VB ne sera plus exécuté. C'est le danger des techniques de hooking et subclassing, ça marche bien en EXE mais faire gaffe à ce que l'on fait en debug.

n°478706
karlkox
Posté le 06-08-2003 à 00:47:44  profilanswer
 

Non, ce que j'ai dit fonctionne tres bien depuis le RAD et en debuggant. Il faut cliquer sur la croix et non sur le bouton Stop.

n°478795
drasche
Posté le 06-08-2003 à 10:01:25  profilanswer
 

karlkox a écrit :

Non, ce que j'ai dit fonctionne tres bien depuis le RAD et en debuggant. Il faut cliquer sur la croix et non sur le bouton Stop.


ooops mal exprimé :D
je parlais pour lui, pas pour toi ;)

n°479281
karlkox
Posté le 06-08-2003 à 20:47:59  profilanswer
 

oki :jap:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VB] Crash de VB en sortie de l'appli

 

Sujets relatifs
connaitre la fin d'un programme executé depuis une appli vbMySQL V 4.1 est-elle vraiment stable pour une appli pro?
[Delphi] Intégrer une font a l'appliWebCLIPS et appli CGI
PHP/C++ passage de paramètres de l'un à l'autre... (appli MFC)rediriger la sortie standard d'un processus
[java] sortie dans un fichier excel?Utilisation de JNI dans une appli web
[VBA/Access] Copier un formulaire d'une appli à une autre [résolu] 
Plus de sujets relatifs à : [VB] Crash de VB en sortie de l'appli


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR