Crash de VB et de mon appli

tchem Messages postés 14 Date d'inscription mercredi 5 juillet 2006 Statut Membre Dernière intervention 19 février 2008 - 21 sept. 2006 à 23:13
tchem Messages postés 14 Date d'inscription mercredi 5 juillet 2006 Statut Membre Dernière intervention 19 février 2008 - 22 sept. 2006 à 10:59
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

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
21 sept. 2006 à 23:46
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)
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 sept. 2006 à 03:45
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
0
tchem Messages postés 14 Date d'inscription mercredi 5 juillet 2006 Statut Membre Dernière intervention 19 février 2008
22 sept. 2006 à 07:57
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 sept. 2006 à 08:55
"Il plante trop souvent" :o

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

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
tchem Messages postés 14 Date d'inscription mercredi 5 juillet 2006 Statut Membre Dernière intervention 19 février 2008
22 sept. 2006 à 10:59
Le bug est connu de microsoft
0
Rejoignez-nous