Wie Module32First freigeben?

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Tommy
Spassvogel
Beiträge: 319
Registriert: 17.10.2013 14:36

Wie Module32First freigeben?

Beitrag 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?
PB 5.41 x64
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Wie Module32First freigeben?

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Tommy
Spassvogel
Beiträge: 319
Registriert: 17.10.2013 14:36

Re: Wie Module32First freigeben?

Beitrag von Tommy »

Danke jetzt gibt das Überlauf Problem nich mehr :allright:
PB 5.41 x64
Antworten