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

Crash de VB en sortie de l'appli [VB] - VB/VBA/VBS - Programmation

Marsh Posté le 04-08-2003 à 15:26:49    

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...

Reply

Marsh Posté le 04-08-2003 à 15:26:49   

Reply

Marsh Posté le 04-08-2003 à 15:40:48    

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.

Reply

Marsh Posté le 04-08-2003 à 15:42:24    

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:)

Reply

Marsh Posté le 04-08-2003 à 15:48:06    

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

Reply

Marsh Posté le 04-08-2003 à 15:55:25    

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 ;)

Reply

Marsh Posté le 04-08-2003 à 16:01:01    

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:

Reply

Marsh Posté le 04-08-2003 à 16:02:14    

skeye a écrit :

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


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

Reply

Marsh Posté le 04-08-2003 à 16:03:33    

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:

Reply

Marsh Posté le 04-08-2003 à 16:07:52    

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.

Reply

Marsh Posté le 04-08-2003 à 16:17:16    

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: )

Reply

Marsh Posté le 04-08-2003 à 16:17:16   

Reply

Marsh Posté le 04-08-2003 à 16:21:12    

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).

Reply

Marsh Posté le 04-08-2003 à 16:28:23    

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:

Reply

Marsh Posté le 04-08-2003 à 16:43:12    

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

Reply

Marsh Posté le 04-08-2003 à 16:54:49    

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.

Reply

Marsh Posté le 05-08-2003 à 00:11:39    

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.

Reply

Marsh Posté le 05-08-2003 à 11:48:08    

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.

Reply

Marsh Posté le 06-08-2003 à 00:47:44    

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.

Reply

Marsh Posté le 06-08-2003 à 10:01:25    

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 ;)

Reply

Marsh Posté le 06-08-2003 à 20:47:59    

oki :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed