Voici le code du problème isolé.
Récupère les processus courants et affiche un listing.
1/ Ne pas cocher la gestion des threads dans les options de compilation = ça fonctionne.
2/ Cocher la gestion des threads dans les options de compilation = ça fonctionne puis ça plante! Différemment selon l'humeur. WHY??
Code : Tout sélectionner
;-Debut
Enumeration
#WIN_PROC
#ListProcessus
#Btn_ScanProcess
EndEnumeration
;structure nécessaire à la recherche des process
Structure PROCESSENTRY33
dwSize.l
cntUsage.l
th32ProcessID.l
th32DefaultHeapID.l
th32ModuleID.l
cntThreads.l
th32ParentProcessID.l
pcPriClassBase.l
dwFlags.l
szExeFile.b[#MAX_PATH]
EndStructure
;structure nécessaire pour obtenir l'usage mémoire
Structure PROCESS_MEMORY_COUNTERS
cb.l
PageFaultCount.l
PeakWorkingSetSize.l
WorkingSetSize.l
QuotaPeakPagedPoolUsage.l
QuotaPagedPoolUsage.l
QuotaPeakNonPagedPoolUsage.l
QuotaNonPagedPoolUsage.l
PagefileUsage.l
PeakPagefileUsage.l
EndStructure
Procedure ColorLines_Listicon(Listing.l); colorise une ligne sur deux dans la listicon
NbLinesImpair = CountGadgetItems(Listing.l) - 1
For NbElementImpair = 0 To NbLinesImpair Step 2
SetGadgetItemColor(Listing.l, NbElementImpair, #PB_Gadget_BackColor, RGB(225, 228, 231), -1)
Next
For NbElementImpair = 1 To NbLinesImpair Step 2
SetGadgetItemColor(Listing.l, NbElementImpair, #PB_Gadget_BackColor, RGB(181, 188, 190), -1)
Next
EndProcedure
Procedure.l ExtractSmallIconFile(IconPath.s) ; 16*16
; Cette procedure permet d'extraire l'ID de l'icône 16*16 associé au type de fichier ou au dossier dont l'adresse est IconPath
SHGetFileInfo_(IconPath, 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_ICON | #SHGFI_SMALLICON)
ProcedureReturn InfosFile\hIcon
EndProcedure
ProcedureDLL GetPidProcess(Name.s)
Name.s=UCase(Name.s)
Recherche=0
If OpenLibrary(0, "Kernel32.dll")
CreateToolhelpSnapshot = GetFunction(0, "CreateToolhelp32Snapshot")
ProcessFirst = GetFunction(0, "Process32First")
ProcessNext = GetFunction(0, "Process32Next")
If CreateToolhelpSnapshot And ProcessFirst And ProcessNext ; Ensure than all the functions are found
Process.PROCESSENTRY33\dwSize = SizeOf(PROCESSENTRY33)
Snapshot = CallFunctionFast(CreateToolhelpSnapshot, #TH32CS_SNAPPROCESS, 0)
If Snapshot
ProcessFound = CallFunctionFast(ProcessFirst, Snapshot, Process)
While ProcessFound
Nom.s=UCase(PeekS(@Process\szExeFile, -1, #PB_Ascii))
Nom=GetFilePart(Nom)
If Nom=Name
Recherche =1
PID=Process\th32ProcessID
EndIf
ProcessFound = CallFunctionFast(ProcessNext, Snapshot, Process)
Wend
EndIf
CloseHandle_(Snapshot)
EndIf
CloseLibrary(0)
EndIf
ProcedureReturn PID
EndProcedure
ProcedureDLL.s PidToFileName(PID.l)
hProcess.l = OpenProcess_(#PROCESS_QUERY_INFORMATION|#PROCESS_VM_READ, #False, PID)
ProcessPath.s = Space(255)
If OpenLibrary(0,"PSAPI.DLL")
*F=GetFunction(0,"GetModuleFileNameExA")
If *F
CallFunctionFast(*F,hProcess,0,@ProcessPath,255)
Else
CloseLibrary(0)
End
EndIf
Else
End
EndIf
ProcedureReturn ProcessPath
EndProcedure
ProcedureDLL GetProcessMemory(PID.l)
pmc.PROCESS_MEMORY_COUNTERS
hProcess.l = OpenProcess_(#PROCESS_QUERY_INFORMATION|#PROCESS_VM_READ, #False, PID)
If OpenLibrary(0,"PSAPI.DLL")
*F=GetFunction(0,"GetProcessMemoryInfo")
If *F
CallFunctionFast(*F,hProcess,@pmc,SizeOf(pmc))
GetProcessusSize = pmc\WorkingSetSize
Else
CloseLibrary(0)
End
EndIf
Else
End
EndIf
ProcedureReturn GetProcessusSize
EndProcedure
ProcedureDLL GetProcessPagefile(PID.l)
pmc.PROCESS_MEMORY_COUNTERS
hProcess.l = OpenProcess_(#PROCESS_QUERY_INFORMATION|#PROCESS_VM_READ, #False, PID)
If OpenLibrary(0,"PSAPI.DLL")
*F=GetFunction(0,"GetProcessMemoryInfo")
If *F
CallFunctionFast(*F,hProcess,@pmc,SizeOf(pmc))
GetProcessusPagefileUsage = pmc\PagefileUsage
Else
CloseLibrary(0)
End
EndIf
Else
End
EndIf
ProcedureReturn GetProcessusPagefileUsage
EndProcedure
ProcedureDLL EnumProcessInit()
Static Initialised
If Initialised=0
Global NewList EnumProcessLList.s()
Initialised=1
Else
ClearList(EnumProcessLList())
EndIf
If OpenLibrary(0, "Kernel32.dll") ;Vista et Xp = C:\Windows\System32\Kernel32.dll"
CreateToolhelpSnapshot = GetFunction(0, "CreateToolhelp32Snapshot")
ProcessFirst = GetFunction(0, "Process32First")
ProcessNext = GetFunction(0, "Process32Next")
If CreateToolhelpSnapshot And ProcessFirst And ProcessNext ; Ensure than all the functions are found
Process.PROCESSENTRY32\dwSize = SizeOf(PROCESSENTRY32)
Snapshot = CallFunctionFast(CreateToolhelpSnapshot, #TH32CS_SNAPPROCESS, 0)
If Snapshot
ProcessFound = CallFunctionFast(ProcessFirst, Snapshot, Process)
While ProcessFound
Temp.s=PeekS(@Process\szExeFile)
If Temp<>"[System Process]"
AddElement(EnumProcessLList())
EnumProcessLList()= Temp
EndIf
ProcessFound = CallFunctionFast(ProcessNext, Snapshot, Process)
Wend
EndIf
CloseHandle_(Snapshot)
EndIf
CloseLibrary(0)
EndIf
ResetList(EnumProcessLList())
ProcedureReturn CountList(EnumProcessLList())
EndProcedure
ProcedureDLL.s EnumProcess()
Static Pointeur
If Pointeur >= CountList(EnumProcessLList())
Pointeur=0
Else
SelectElement(EnumProcessLList(),Pointeur)
Retour.s=EnumProcessLList()
Pointeur+1
EndIf
ProcedureReturn Retour.s
EndProcedure
Procedure ListingProcess()
Protected Templ.s,path.s,pid.l,size.s,Memory.s,PageFile.s
EnumProcessInit()
; Title.s = Str(EnumProcessInit())+ " Processus détectés"
; SetGadgetItemText(#ListProcessus, -1, Title, 0)
Repeat
Templ = EnumProcess()
If Templ<>""
pid = GetPidProcess(Templ)
path.s = PidToFileName(pid)
If path <>"" Or path<>"?"
If FileSize(path) > 0
size = StrF(FileSize(path)/1024,2)+" ko"
Memory = Str(GetProcessMemory(pid)/1024)+" ko"
PageFile = Str(GetProcessPagefile(pid)/1024)+" ko"
Else
size = ""
Memory = ""
PageFile = ""
EndIf
EndIf
icon = ExtractSmallIconFile(Path)
AddGadgetItem(#ListProcessus,-1,Templ +Chr(10)+ Str(pid) +Chr(10)+ size +Chr(10)+ Memory +Chr(10)+ PageFile +Chr(10)+ path ,icon)
EndIf
Until Templ=""
ColorLines_Listicon(#ListProcessus)
EndProcedure
ExamineDesktops()
Largeur$ = Str(DesktopWidth(0))
Hauteur$ = Str(DesktopHeight(0))
WinX = 1014
WinY = 718
If Val(Largeur$)>1014 And Val(Hauteur$)>718
FlagWin = #PB_Window_SystemMenu|#PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget|#PB_Window_ScreenCentered|#PB_Window_TitleBar|#PB_Window_Invisible
Else
FlagWin = #PB_Window_SystemMenu|#PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget|#PB_Window_TitleBar|#PB_Window_Invisible
EndIf
If OpenWindow(#WIN_PROC,0,0,WinX,WinY,"Test" ,FlagWin)=0 Or CreateGadgetList(WindowID(#WIN_PROC))=0
End
EndIf
ListIconGadget(#ListProcessus, 5, 5, 1004, 605, "Nom", 200,#PB_ListIcon_FullRowSelect)
AddGadgetColumn(#ListProcessus,1,"PID",50)
AddGadgetColumn(#ListProcessus,2,"Taille fichier",100)
AddGadgetColumn(#ListProcessus,3,"Mémoire utilisée",100)
AddGadgetColumn(#ListProcessus,4,"Pagination",100)
AddGadgetColumn(#ListProcessus,5,"Emplacement, chemin complet",400)
ButtonGadget(#Btn_ScanProcess,10,620,60,30,"Actualiser")
GadgetToolTip(#Btn_ScanProcess,"Actualiser la liste en procédant à un nouveau scan")
ListingProcess()
HideWindow(#WIN_PROC,0)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case #Btn_ScanProcess
ClearGadgetItemList(#ListProcessus)
CreateThread(@ListingProcess(),0)
;-End
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
End