Crash de VB et de mon appli

Signaler
Messages postés
14
Date d'inscription
mercredi 5 juillet 2006
Statut
Membre
Dernière intervention
19 février 2008
-
Messages postés
14
Date d'inscription
mercredi 5 juillet 2006
Statut
Membre
Dernière intervention
19 février 2008
-
J'ai un souci à un endroit dans mon programme, lorsque j'appelle une fonction. Cette fonction ne crash pas tout le temps, si elle se crash pas la 1ere fois, elle ne se cashera plus apres. Par contre 2 fois sur 3 elle me crashe des le debut.
Crash = *.exe se ferme, et en mode debug meme VB se ferme !
Voila le code, merci d'avance

'-----------------------------------------------------------------------------
' Recupere le presse-papier
' -------------------------
Public Function Presse_Papier() As String
   Dim hClipMemory As Long
   Dim lpClipMemory As Long
   Dim MyString As String
   Dim RetVal As Long

   If OpenClipboard(0&) = 0 Then
      MsgBox "Cannot open Clipboard. Another app. may have it open"
      Exit Function
   End If
        
   ' Obtain the handle to the global memory
   ' block that is referencing the text.
   hClipMemory = GetClipboardData(CF_TEXT)
   If IsNull(hClipMemory) Then
      MsgBox "Could not allocate memory"
      GoTo OutOfHere
   End If

   ' Lock Clipboard memory so we can reference
   ' the actual data string.
   lpClipMemory = GlobalLock(hClipMemory)

   If Not IsNull(lpClipMemory) Then
      MyString = Space$(MAXSIZE)
      RetVal = lstrcpy(MyString, lpClipMemory)
      RetVal = GlobalUnlock(hClipMemory)
     
      ' Peel off the null terminating character.
   Else
      MsgBox "Could not lock memory to copy string from."
   End If

OutOfHere:

   RetVal = CloseClipboard()
   Presse_Papier = MyString
End Function

5 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Salut
Bah faut poser la question à l'auteur de ce bout de code !
Mais pour récupérer une chaine dans le presse-papier, pas besoin de tout ce code, ceci devrait suffire :
MyString = Clipboard.GetText (ClipBoardConstants.vbCFText)

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
74
J'ignore où tu as été chercher un code aussi tordu....


pour un format Text, pas besoin d'API, comme le souligne mon ami Jack


c'est quoi ce MAXSIZE qui prétend limiter la taille du presse papier... tes donnes seront tronquées parfois...

d'autres, tu lira trop loins en mémoire, et tu crashera ton appli

utilises simplement GlobalSize


le test :

If Not IsNull(lpClipMemory) Then

est faux....

faire simplement :

If lpClipMemory Then


ce qui nous donne, une fois nettoyé :


Private Declare Function CloseClipboard Lib "user32.dll" () As Long

Private Declare Function GetClipboardData Lib "user32.dll" (ByVal wFormat As Long) As Long

Private Declare Function GlobalLock Lib "kernel32.dll" (ByVal hMem As Long) As Long

Private Declare Function GlobalSize Lib "kernel32.dll" (ByVal hMem As Long) As Long

Private Declare Function GlobalUnlock Lib "kernel32.dll" (ByVal hMem As Long) As Long

Private Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyA" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long

Private Declare Function OpenClipboard Lib "user32.dll" (ByVal hwnd As Long) As Long


Private Const CF_TEXT As Long = 1


Public Function Presse_Papier() As String

Dim hClipMemory As Long

Dim lpClipMemory As Long

    If OpenClipboard(0&) Then

        hClipMemory = GetClipboardData(CF_TEXT)

        If hClipMemory Then

            lpClipMemory = GlobalLock(hClipMemory)

            If lpClipMemory Then

               
Presse_Papier = Space$(GlobalSize(lpClipMemory))

                lstrcpy Presse_Papier, lpClipMemory

               
Presse_Papier = Left$(Presse_Papier, InStr(Presse_Papier, vbNullChar) -
1)

                GlobalUnlock hClipMemory

            End If

        End If

        CloseClipboard

    End If

End Function

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
14
Date d'inscription
mercredi 5 juillet 2006
Statut
Membre
Dernière intervention
19 février 2008

Merci beaucoup, je vais tester cela tout de suite.
Je n'utilise pas clipboard.gettext parce qu'il plante beaucoup trop souvent (impossible d'ouvrir le presse-papier) donc je voulais tester par cette API
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
74
"Il plante trop souvent" :o

j'ai j'amais eu aucun soucis avec....

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
14
Date d'inscription
mercredi 5 juillet 2006
Statut
Membre
Dernière intervention
19 février 2008

Le bug est connu de microsoft