Page 1 sur 1

[resolu] Probleme pour effacer un simple répertoire ! ??

Publié : sam. 09/août/2008 16:18
par Ar-S
Voilà un soucis qui me prend la courge.
Surement tout bête mais je ne comprend pas pourquoi ça ne fonctionne pas.

Librarie externe : droopy Libs

En gros je récupère dans la base de registre le répertoire des fichiers en 'Cache' d'IE pour pouvoir les vider. Le répertoire détecté est bien le bon mais rien ne s'efface.

Code : Tout sélectionner

; Répertoire des fichiers cache dans la BDR
CleCache$="HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
ValCacheIE$="Cache" ; REG_SZ  

RepCacheIE$=RegGetValue(CleCache$,ValCacheIE$,".") ; Va chercher le répertoire des temp internet dans la base de registre

Debug RepCacheIE$ ; Test du répertoire trouvé 

If DeleteDirectory(RepCacheIE$,"*.*",#PB_FileSystem_Recursive|#PB_FileSystem_Force)
  MessageRequester ("Info","Super ça marche",#MB_ICONINFORMATION)
Else
  MessageRequester ("Info","Erreur",#MB_ICONWARNING)
EndIf 

End

Publié : sam. 09/août/2008 17:15
par Anonyme2
Je n'ai pas testé ton code.

Ca me rappelle un code que j'avais donné en 2004 avec les interfaces IShellFolder & IEnumIDList permettant d'afficher les données de différents dossiers.

c'est ici pour info
http://www.purebasic.fr/french/viewtopic.php?t=864


Il me semble que ce qui se trouve dans ce dossier particulier n'est pas des fichiers mais des objets, il faudrait peut-être utiliser les interfaces pour effacer son contenu.
Je n'arrivais pas à obtenir les noms de fichiers avec les commandes PB.

SI quelqu'un à un code simple qui marche, je prend. :D

A+
denis

Publié : dim. 10/août/2008 11:04
par Anonyme2
Tu peux regarder le code de (ancien) de Hi-Toro (forum anglais)

http://www.purebasic.fr/english/viewtop ... file+cache


Il faut utiliser des API particulières

A+
Denis

Publié : dim. 10/août/2008 14:18
par Ar-S
Superbe !
J'ai reussi grâce à ces codes de James / hi - toro / Flype et Droopy :P

Publié : dim. 10/août/2008 14:50
par Anonyme2
Sinon j'ai modifié mon code avec les interfaces pour afficher le contenu du dossier cache internet

Code : Tout sélectionner

; Auteur : Denis
; Version de PB : 3.91
; Date : 02 juin 2004
; Testé sous WIN98 SE

; Modifié le 10 août 2008
; Version de PB : 4.20
; Testé sous VISTA home edition + SP1



;
; Explication du programme :
; Utilisation des interfaces IShellFolder et IEnumIDList pour afficher le contenu
; du dossier 'Cache intenet'  pour cet exemple



; constantes possibles utilisables par la méthode EnumObjects de l'interface IShellFolder
#SHCONTF_FOLDERS = $0020
#SHCONTF_NONFOLDERS = $0040
#SHCONTF_INCLUDEHIDDEN = $0080
#SHCONTF_INIT_ON_FIRST_NEXT = $0100
#SHCONTF_NETPRINTERSRCH = $0200
#SHCONTF_SHAREABLE = $0400
#SHCONTF_STORAGE = $0800

; constantes possibles utilisables par la méthode GetDisplayNameOf de l'interface IShellFolder
#SHGDN_NORMAL = $0000
#SHGDN_INFOLDER = $0001
; #SHGDN_FOREDITING = 2
; #SHGDN_FORADDRESSBAR = 3
; #SHGDN_FORPARSING = 4

; constantes possibles pour le paramètre uType de la structure STRRET
#STRRET_WSTR = 0
#STRRET_OFFSET = 1
#STRRET_CSTR = 2

; quelques constantes possibles pour l'API SHGetSpecialFolderLocation
#CSIDL_DESKTOP = 0
#CSIDL_PRINTERS = 4
#CSIDL_RECENT = 8
#CSIDL_SENDTO = 9
#CSIDL_STARTMENU = 11
; #CSIDL_FONTS = $14
#CSIDL_INTERNET_CACHE = $0020
#CSIDL_INTERNET       = $0001


; constantes possibles pour l'API CoInitializeEx
#COINIT_MULTITHREADED = 0
#COINIT_APARTMENTTHREADED = 2
#COINIT_DISABLE_OLE1DDE = 4
#COINIT_SPEED_OVER_MEMORY = 8

;- Constantes utilisateur
Enumeration
     #MainWindow      ; fenêtre principale
     #ListIconGadget = 1
     #shlwapi_dll = 0 ; identifiant dll
EndEnumeration



;- Structure
Structure STRRET
     uType.l
     StructureUnion
          pOleStr.l
          uOffset.l
          cStr.b[#MAX_PATH]
     EndStructureUnion
EndStructure

;- Variables globales
Global ppMalloc.l ; pointeur sur l'interface Shell IMalloc
; ; /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
; ; \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/


;- Debut prog
If OpenWindow(#MainWindow, 0, 0, 600, 400, "Explorer les dossiers avec IShellFolder", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
     If CreateGadgetList(WindowID(#MainWindow))
          IdListIcon = ListIconGadget(#ListIconGadget, 10, 10, 580, 380, "Contenu du Dossier SEND TO", 575, #LVS_SHAREIMAGELISTS)
          HideGadget(#ListIconGadget, 1)
          
          CoInitializeEx_(0, #COINIT_SPEED_OVER_MEMORY) ; Initialise la librairie COM pour le thread courant
          
          shlwapiDll = OpenLibrary(#shlwapi_dll, "shlwapi.dll")
          
          SHGetMalloc_(@pMalloc)
          pszDisplayName = AllocateMemory((#MAX_PATH * 2) + 2)
          
          ; l'API SHGetSpecialFolderLocation retourne  #S_OK en cas de succès sinon une  erreur
          ; Cette API est remplacée par l'API SHGetFolderLocation depuis Windows 2000, mais
          ; fonctionne avec les nouveaux OS
          ; L'API retourne dans ppidl un pointeur sur un élément identifiant une liste specifiant
          ; la localisation du dossier relatif à la racine du 'name space' (le bureau)
          If SHGetSpecialFolderLocation_(0, #CSIDL_INTERNET_CACHE, @ppidl.l) = #NOERROR And shlwapiDll
               
               ; SHGetDesktopFolder retourne dans ppshf le pointeur sur l'interface IShellFolder
               ; pour le dossier 'Bureau'
               If SHGetDesktopFolder_(@ppshf.IShellFolder) = #NOERROR
                    
                    ; la méthode BindToObject de l'interface IShellFolder retrouve un object IShellFolder
                    ; pour un sous-dossier
                    If ppshf\BindToObject(ppidl, 0, ?IID_IShellFolder, @ppvOut.IShellFolder) = #NOERROR
                         
                         ppshf\Release() ; on libère l'interface IShellFolder retournée par
                         ; SHGetDesktopFolder, on n'en a plus besoin
                         
                         ; La méthode BindToObject de l'interface IShellFolder a retourné dans ppvOut
                         ; un pointeur sur une interface IShellFolder  pour un sous-dossier
                         ; on peut donc commencer l'énumération avec la méthode EnumObjects (interface IShellFolder)
                         ; EnumObjects permet de déterminer le contenu d'un dossier en créant un élément
                         ; identifiant un object 'énumeration' et retournant son interface IEnumIDList.
                         ; Les méthodes supportée par cette interface peuvent être utilisées pour énumérer
                         ; le contenu d'un dossier.
                         If ppvOut\EnumObjects(0, #SHCONTF_FOLDERS | #SHCONTF_NONFOLDERS, @ppenum.IEnumIDList) = #S_OK
                              
                              ; La méthode Next de l'interface IEnumIDList permet de commencer l'énumération
                              ; La méthode Next énumère dans notre cas les éléments un par un (1er paramètre quui indique
                              ; aussi que pidlItems est un tableau à un élément. Pour retrouver plus d'éléments à la fois,
                              ; il faut dimensionner le tableau avec SHGetMalloc
                              ; celtFetched retourne une valeur qui indique combien d'éléments sont retournés par
                              ; la fonction et dans notre cas au max 1 sinon 0 si plus d'éléments
                              hr = ppenum\Next(1, @pidlItems, @celtFetched)
                              
                              ; on teste dans la boucle qu'il n'y a pas d'erreur et qu'il y a bien un élément
                              While ((hr = #NOERROR) And (celtFetched = 1))
                                   
                                   ; la méthopde GetDisplayNameOf de l'interface IShellFolder retrouve
                                   ; le nom d'affichage pour le dossier)fichier object spécifié.
                                   ; le 3ème paramètre est une variable basée sur la structure STRRET
                                   strDispName.STRRET\uType = #STRRET_OFFSET
                                   If ppvOut\GetDisplayNameOf(pidlItems, #SHGDN_INFOLDER, @strDispName.STRRET) = #NOERROR
                                        
                                        ; La chaine retournée par GetDisplayNameOf doit être formatée avant d'être
                                        ; affichée correctement avec l'API StrRetToBufA de la dll shlwapi.dll
                                        ; pszDisplayName est le buffer qui recevra la chaine à afficher
                                        CallFunction(#shlwapi_dll, "StrRetToBufA", @strDispName, pidlItems, pszDisplayName, #MAX_PATH)
                                        
                                        ; on affiche dans la Listicon
                                        AddGadgetItem(#ListIconGadget, 0, PeekS(pszDisplayName))
                                        ;
                                        hr = ppenum\Next(1, @pidlItems, @celtFetched)
                                   EndIf
                              Wend
                              CloseLibrary(#shlwapi_dll) ; ferme shlwapi.dll
                         EndIf
                    EndIf
               EndIf
          EndIf
          If pszDisplayName
               FreeMemory(pszDisplayName)
          EndIf
          HideGadget(#ListIconGadget, 0)
     EndIf
     
     CoTaskMemFree_(ppidl) ; libère la mémoire pointée par ppidl
     
     
     ; on affiche le nombre d'éléments dans la barre de la listeicongadget
     SetGadgetItemText(#ListIconGadget, -1, GetGadgetItemText(#ListIconGadget, -1, 0)+"  - "+Str(CountGadgetItems(#ListIconGadget))+ " objets trouvés")
     
     ;- boucle evenements
     While WaitWindowEvent() <> #PB_Event_CloseWindow And EventWindow() <> WindowID(#MainWindow)
     Wend
     
EndIf
CoUninitialize_() ; ferme la librairie COM pour le thread courant

End


DataSection
     ; Interface IShellFolder;
     ; helpstring("IShellFolder"),
     ; uuid(000214E6-0000-0000-C000-000000000046)
     
     IID_IShellFolder : ; cléf du registre mise sous la forme de DATA
     Data.l $000214E6
     Data.w $0000, $0000
     Data.b $C0, $00, $00, $00, $00, $00, $00, $46
EndDataSection
A+
Denis

Publié : dim. 10/août/2008 15:10
par Ar-S
Merci pour ce code Denis, mon problème étaient bien de supprimer ces fichiers et non de les lister. Mais merci de ton aide, je garde ton code de coté :)

Re: [resolu] Probleme pour effacer un simple répertoire ! ??

Publié : ven. 22/févr./2013 11:57
par Anonyme2
Mise à jour du code pour l'exemple du dossier 'Send to'

Fonctionne sous seven 7 pro x86-x64, PB 5.10, Vista x86 et XP x86 avec tous les pack

Sous Seven, les 2 drives lecteur DVD et le disque amovible (clée USB 32 Go n'apparaissent pas :roll: )

Code : Tout sélectionner

;//  Auteur : Denis
;//  Version de PB : 3.91
;//  Date : 02 juin 2004
;//  Testé sous WIN98 SE  x86

;//  Modifié le 10 août 2008
;//  Version de PB : 4.20
;//  Testé sous VISTA home edition + SP1  x86

;//  Modifié le 22 février 2012
;//  Version de PB : 5.10
;//  Testé sous Seven pro + SP1  x86/x64

;
;//  Explication du programme :
;//  Utilisation des interfaces IShellFolder et IEnumIDList pour afficher le contenu
;//  du dossier 'Send to'  pour cet exemple

Define .i

;//  constantes possibles utilisables par la méthode EnumObjects de l'interface IShellFolder
#SHCONTF_FOLDERS = $0020
#SHCONTF_NONFOLDERS = $0040
#SHCONTF_INCLUDEHIDDEN = $0080
#SHCONTF_INIT_ON_FIRST_NEXT = $0100
#SHCONTF_NETPRINTERSRCH = $0200
#SHCONTF_SHAREABLE = $0400
#SHCONTF_STORAGE = $0800

;//  constantes possibles utilisables par la méthode GetDisplayNameOf de l'interface IShellFolder
#SHGDN_NORMAL = $0000
#SHGDN_INFOLDER = $0001
;//  #SHGDN_FOREDITING = 2
;//  #SHGDN_FORADDRESSBAR = 3
;//  #SHGDN_FORPARSING = 4

;//  constantes possibles pour le paramètre uType de la structure STRRET
#STRRET_WSTR = 0
#STRRET_OFFSET = 1
#STRRET_CSTR = 2

;//  quelques constantes possibles pour l'API SHGetSpecialFolderLocation
#CSIDL_DESKTOP = 0
#CSIDL_PRINTERS = 4
#CSIDL_RECENT = 8
#CSIDL_SENDTO = 9
#CSIDL_STARTMENU = 11
;//  #CSIDL_FONTS = $14
#CSIDL_INTERNET_CACHE = $0020
#CSIDL_INTERNET       = $0001


;//  constantes possibles pour l'API CoInitializeEx
#COINIT_MULTITHREADED = 0
#COINIT_APARTMENTTHREADED = 2
#COINIT_DISABLE_OLE1DDE = 4
#COINIT_SPEED_OVER_MEMORY = 8

;- Constantes utilisateur
Enumeration
      #MainWindow      ;//  fenêtre principale
      #ListIconGadget = 1
      #shlwapi_dll = 0 ;//  identifiant dll
EndEnumeration

Macro msg(valeur)
      MessageRequester("Erreur", valeur,16)
EndMacro

;- Structure
Structure STRRET
      uType.l
      StructureUnion
            *pOleStr
            uOffset.l
            cStr.u[#MAX_PATH]
      EndStructureUnion
EndStructure


;//  typedef struct _STRRET {
;//    UINT  uType;
;//    union {
;//      LPWSTR pOleStr;
;//      UINT   uOffset;
;//      CHAR   cStr[MAX_PATH];
;//    };
;//  } STRRET, *LPSTRRET;

;- Variables globales
CompilerIf #PB_Compiler_Unicode
      StrRetToBuf$ = "StrRetToBufW"
      
CompilerElse
      StrRetToBuf$ = "StrRetToBufA"
CompilerEndIf


Prototype StrRetToBuf(*_strDispName, _pidlItems, *_pszDisplayName, MemorySize_of_pszDisplayName)


Global *StrRetToBuf.StrRetToBuf  ;//  pointeur sur l'interface Shell IMalloc

;//  /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
;//  \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

;- Debut prog
If OpenWindow(#MainWindow, 0, 0, 600, 400, "Explorer les dossiers avec IShellFolder", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
      IdListIcon = ListIconGadget(#ListIconGadget, 10, 10, 580, 380, "Contenu du Dossier SEND TO", 575, #LVS_SHAREIMAGELISTS)
      HideGadget(#ListIconGadget, 1)
      
      CoInitializeEx_(0, #COINIT_SPEED_OVER_MEMORY) ;//  Initialise la librairie COM pour le thread courant
      
      shlwapiDll = OpenLibrary(#shlwapi_dll, "shlwapi.dll")
      If shlwapiDll = #Null
            CoUninitialize_() ;//  ferme la librairie COM pour le thread courant
            msg("Impossible d'ouvrir la dll shlwapi.dll")
            End
      EndIf
      
      *StrRetToBuf = GetFunction(#shlwapi_dll, StrRetToBuf$)
      If *StrRetToBuf = #Null
            CloseLibrary(#shlwapi_dll) ;// ferme shlwapi.dll
            CoUninitialize_() ;// ferme la librairie COM pour le thread courant
            msg("Impossible d'obtenir l'adresse e la fonction 'StrRetToBuf' à partir de la dll shlwapi.dll")
            End
      EndIf
      
      *pszDisplayName = AllocateMemory((#MAX_PATH * SizeOf(character)) + 2)
      If *pszDisplayName = #Null
            CloseLibrary(#shlwapi_dll) ;// ferme shlwapi.dll
            CoUninitialize_() ;// ferme la librairie COM pour le thread courant
            msg("Impossible d'allouer de la mémoire")
            End
      EndIf
      
      ;// l'API SHGetSpecialFolderLocation retourne  #S_OK en cas de succès sinon une  erreur
      ;// Cette API est remplacée par l'API SHGetFolderLocation depuis Windows 2000, mais
      ;// fonctionne avec les nouveaux OS
      ;// L'API retourne dans ppidl un pointeur sur un élément identifiant une liste specifiant
      ;// la localisation du dossier relatif à la racine du 'name space' (le bureau)
      If SHGetSpecialFolderLocation_(0, #CSIDL_SENDTO, @ppidl) <> #NOERROR
            FreeMemory(*pszDisplayName)
            CloseLibrary(#shlwapi_dll) ;// ferme shlwapi.dll
            CoUninitialize_() ;// ferme la librairie COM pour le thread courant
            msg("Impossible d'obtenir le pointeur sur l'objet 'ppidl'")
            End
      EndIf
      
      ;// SHGetDesktopFolder retourne dans ppshf le pointeur sur l'interface IShellFolder
      ;// pour le dossier 'Send To'
      If SHGetDesktopFolder_(@ppshf.IShellFolder) <> #NOERROR
            FreeMemory(*pszDisplayName)
            CloseLibrary(#shlwapi_dll) ;// ferme shlwapi.dll
            CoUninitialize_() ;// ferme la librairie COM pour le thread courant
            msg("Impossible d'obtenir le pointeur sur l'objet 'IShellFolder' de l'API SHGetDesktopFolder_()")
            End
      EndIf
      
      ;// la méthode BindToObject de l'interface IShellFolder retrouve un object IShellFolder
      ;// pour un sous-dossier
      If ppshf\BindToObject(ppidl, 0, ?IID_IShellFolder, @ppvOut.IShellFolder) <> #NOERROR
            ppshf\Release() ;// on libère l'interface IShellFolder retournée par SHGetDesktopFolder
            FreeMemory(*pszDisplayName)
            CloseLibrary(#shlwapi_dll) ;// ferme shlwapi.dll
            CoUninitialize_() ;// ferme la librairie COM pour le thread courant
            msg("Impossible d'obtenir le pointeur sur l'objet 'IShellFolder' de la méthode BindToObject")
            End
      EndIf
      
      ppshf\Release() ;// on libère l'interface IShellFolder retournée par
      ;// SHGetDesktopFolder, on n'en a plus besoin
      
      ;// La méthode BindToObject de l'interface IShellFolder a retourné dans ppvOut
      ;// un pointeur sur une interface IShellFolder  pour un sous-dossier
      ;// on peut donc commencer l'énumération avec la méthode EnumObjects (interface IShellFolder)
      ;// EnumObjects permet de déterminer le contenu d'un dossier en créant un élément
      ;// identifiant un object 'énumeration' et retournant son interface IEnumIDList.
      ;// Les méthodes supportée par cette interface peuvent être utilisées pour énumérer
      ;// le contenu d'un dossier.
      If ppvOut\EnumObjects(0, #SHCONTF_FOLDERS | #SHCONTF_NONFOLDERS, @ppenum.IEnumIDList) <> #S_OK
            FreeMemory(*pszDisplayName)
            CloseLibrary(#shlwapi_dll) ;// ferme shlwapi.dll
            CoUninitialize_() ;// ferme la librairie COM pour le thread courant
            msg("Impossible d'obtenir le contenu du dossier")
            End
      EndIf
      
      ;// La méthode Next de l'interface IEnumIDList permet de commencer l'énumération
      ;// La méthode Next énumère dans notre cas les éléments un par un (1er paramètre quui indique
      ;// aussi que pidlItems est un tableau à un élément. Pour retrouver plus d'éléments à la fois,
      ;// il faut dimensionner le tableau avec SHGetMalloc
      ;// celtFetched retourne une valeur qui indique combien d'éléments sont retournés par
      ;// la fonction et dans notre cas au max 1 sinon 0 si plus d'éléments
      hr = ppenum\Next(1, @pidlItems, @celtFetched)
      
      ;// on teste dans la boucle qu'il n'y a pas d'erreur et qu'il y a bien un élément
      While ((hr = #NOERROR) And (celtFetched = 1))
            
            ;// la méthopde GetDisplayNameOf de l'interface IShellFolder retrouve
            ;// le nom d'affichage pour le dossier)fichier object spécifié.
            ;// le 3ème paramètre est une variable basée sur la structure STRRET
            strDispName.STRRET\uType = #STRRET_OFFSET
            If ppvOut\GetDisplayNameOf(pidlItems, #SHGDN_INFOLDER, @strDispName.STRRET) = #NOERROR
                  
                  ;// La chaine retournée par GetDisplayNameOf doit être formatée avant d'être
                  ;// affichée correctement avec l'API StrRetToBufA ou StrRetToBufW de la dll shlwapi.dll
                  ;// *pszDisplayName est le buffer qui recevra la chaine à afficher
                  *StrRetToBuf(@strDispName, pidlItems, *pszDisplayName, MemorySize(*pszDisplayName))
                  
                  ;//  on affiche dans la Listicon
                  AddGadgetItem(#ListIconGadget, 0, PeekS(*pszDisplayName))
                  ;
                  hr = ppenum\Next(1, @pidlItems, @celtFetched)
            EndIf
      Wend
      CloseLibrary(#shlwapi_dll) ;// ferme shlwapi.dll
EndIf
If *pszDisplayName
      FreeMemory(*pszDisplayName)
EndIf
HideGadget(#ListIconGadget, 0)

CoTaskMemFree_(ppidl) ;// libère la mémoire pointée par ppidl

;// on affiche le nombre d'éléments dans la barre de la listeicongadget
SetGadgetItemText(#ListIconGadget, -1, GetGadgetItemText(#ListIconGadget, -1, 0)+"  - "+Str(CountGadgetItems(#ListIconGadget))+ " objets trouvés")

;- boucle evenements
While WaitWindowEvent() <> #PB_Event_CloseWindow And EventWindow() <> WindowID(#MainWindow)
Wend


CoUninitialize_() ;// ferme la librairie COM pour le thread courant

End


DataSection
      ;// Interface IShellFolder;
      ;// helpstring("IShellFolder"),
      ;// uuid(000214E6-0000-0000-C000-000000000046)
      
      IID_IShellFolder : ;// clée IShellFolder mise sous la forme de DATA
      Data.l $000214E6
      Data.w $0000, $0000
      Data.b $C0, $00, $00, $00, $00, $00, $00, $46
EndDataSection

Re: [resolu] Probleme pour effacer un simple répertoire ! ??

Publié : ven. 22/févr./2013 21:50
par Kwai chang caine
J'imaginais pas qu'il y avait autant de bordel dans le dossier IE, c'est tout mélangé, les images, les cookies, les liens, on se demande comment il s'y retrouve 8O

Pour le second, marche niquel, il m'en manque juste un chez moi, le lecteur de disquette A

Merci DENIS pour ces deux supers codes. 8)

Re: [resolu] Probleme pour effacer un simple répertoire ! ??

Publié : sam. 23/févr./2013 10:58
par Anonyme2
Il faudrait que je regarde de plus près les flag des fonctions pour faire apparaître les disques manquant.

la structure STRRET ne correspond pas à la définition de microsoft, j'ai du laisser pour la version ASCII le caractère à une taille d'un word et pas d'un byte, il ne faut pas toujours se baser sur le site de microsoft concernant la définition des types, c'est domage que la doc MS n'est pas à jour, c'est volontaire à mon avis.
http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Le code qui va bien est le dernier car il fonctionne sous x86-x64 et je l'ai réécrit comme je code aujourd'hui.
Je n'imbrique plus de if then etc à n'en plus finir car on finit par se tromper dans certains cas.

Je préfère faire un test, c'est bon je continue et je suis sur après que les éléments existent, sinon je retourne et je libère les éléments.