Seite 1 von 1

Wie Module32First freigeben?

Verfasst: 08.02.2015 15:52
von Tommy
Ich habe ein Code gefunden zum auslesen des Prozess Namen und funktioniert auch gut:

Code: Alles auswählen

Define Event, i

Procedure.s GetProcessName(PID)
  Protected GetProcessName.s
  Protected ModEnt.MODULEENTRY32
  
  ModEnt\dwSize = SizeOf(ModEnt)
  
  If Module32First_(CreateToolhelp32Snapshot_(#TH32CS_SNAPMODULE, PID), ModEnt)
    GetProcessName = GetFilePart(PeekS(@ModEnt\szExePath))
  EndIf
  
  ; fehlt hier was ?
  
  ProcedureReturn GetProcessName
EndProcedure

If OpenWindow(0, 300, 250, 300, 250, "", #PB_Window_SystemMenu)
  AddWindowTimer(0, 1, 10)
 
  Repeat
    Event = WaitWindowEvent()
    If Event = #PB_Event_Timer
      Select EventTimer()
        Case 1
          For i=1 To 100
            Debug GetProcessName(GetCurrentProcessId_())
          Next
      EndSelect
    EndIf
  Until Event = #PB_Event_CloseWindow
EndIf
Aber! Wenn ihr es ausführt achtet bitte im Task Manager auf den Speicher verbrauch!
Achtung es steigt sehr schnell an! Bitte rechtzeitig das Fenster wieder schließen bevor
euer RAM vollläuft und Windows abstürzt!

Irgendwas fehlt doch nach dem auslesen oder? Free oder Close Befehl?

Re: Wie Module32First freigeben?

Verfasst: 08.02.2015 15:55
von RSBasic
Es liegt nicht am Module32First_(), sondern am CreateToolhelp32Snapshot_(). Dieser Befehl gibt eine Handle-Nummer zurück und muss selbstverständlich am Ende wieder freigegeben werden:

Code: Alles auswählen

EnableExplicit

Define Event, i

Procedure.s GetProcessName(PID)
  Protected GetProcessName.s
  Protected ModEnt.MODULEENTRY32
  Protected Snapshot
  
  ModEnt\dwSize = SizeOf(ModEnt)
  
  Snapshot = CreateToolhelp32Snapshot_(#TH32CS_SNAPMODULE, PID)
  If Module32First_(Snapshot, ModEnt)
    GetProcessName = GetFilePart(PeekS(@ModEnt\szExePath))
  EndIf
  
  CloseHandle_(Snapshot)
  
  ProcedureReturn GetProcessName
EndProcedure

If OpenWindow(0, 300, 250, 300, 250, "", #PB_Window_SystemMenu)
  AddWindowTimer(0, 1, 10)
 
  Repeat
    Event = WaitWindowEvent()
    If Event = #PB_Event_Timer
      Select EventTimer()
        Case 1
          For i=1 To 100
            Debug GetProcessName(GetCurrentProcessId_())
          Next
      EndSelect
    EndIf
  Until Event = #PB_Event_CloseWindow
EndIf

Re: Wie Module32First freigeben?

Verfasst: 08.02.2015 18:00
von Tommy
Danke jetzt gibt das Überlauf Problem nich mehr :allright: