Unicode Process32First

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Unicode Process32First

Beitrag von _JON_ »

Hallo, habe im Forum diesen Code zum ermitteln der PID von einem Prozess gefunden:

Code: Alles auswählen

Procedure GetPID(ProcessName.s)
  hSnapShot = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS,#Null)

  If hSnapShot
   
    iResult = -1
    pInfo.PROCESSENTRY32
    pInfo\dwsize    = SizeOf(PROCESSENTRY32)
    bProcAvailable  = Process32First_(hSnapShot, @pInfo)
   
    While(bProcAvailable) And (Not iResult = 0)
      bProcAvailable = Process32Next_(hSnapShot, @pInfo)
      iResult = CompareMemoryString(@pInfo\szExeFile,@ProcessName,1) 
    Wend
   
    CloseHandle_(hSnapShot)
   
    ProcedureReturn pInfo\th32ProcessID
   
  EndIf
EndProcedure

Debug GetPID("explorer.exe")
Funktioniert auch unter x86 als Ansi und Unicode. Doch unter PB x64 nur als ANSi.

Hat jemand eine Idee warum Process32First_ in Unicode x64 immer 0 zurück gibt?
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Benutzeravatar
shadow
Beiträge: 189
Registriert: 23.03.2005 17:52
Wohnort: Lübeck

Re: Unicode Process32First

Beitrag von shadow »

Versuch es mal mit Process32FirstW_ mit den selben Parametern. Jedenfalls steht es so in der MSDN für den Unicode-Aufruf (http://msdn.microsoft.com/en-us/library ... 85%29.aspx).

Sorry, hab grad keinen PB-Compiler in der Nähe um es zu testen...
ThinkPad T61 (in Gedenken) | PureBasic 4.61 B1 (32) | Windows 7 (32SP1) | ArchLinux (32) | Syllable (32)
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: Unicode Process32First

Beitrag von _JON_ »

Danke hab das mal probiert, funktioniert leider noch nicht. ShowError gibt mir 24
Das Programm hat einen Befehl ausgegeben, aber die Befehlslänge ist falsch.

Oje, was meint er mit Befehlslänge den eigentlich ?

Code: Alles auswählen

Procedure.s ShowError () 
  error = GetLastError_ ()
  Debug error
  If error 
    *MemoryID = AllocateMemory (255)
    length = FormatMessage_ (#FORMAT_MESSAGE_FROM_SYSTEM, #Null, error, 0, *MemoryID, 255, #Null) 
    If length > 1 ; Some error messages are "" + Chr (13) + Chr (10)... stoopid M$... :( 
        e$ = PeekS (*MemoryID, length - 2) 
    Else 
        e$ = "Unknown error!" 
    EndIf 
    ;FreeMemory (0) 
    ProcedureReturn e$ 
  Else 
    ProcedureReturn "No error has occurred!" 
  EndIf 
EndProcedure 




Structure PROCESSENTRY32W
  dwSize.l
  cntUsage.l
  th32ProcessID.l
  *th32DefaultHeapID.l
  th32ModuleID.l
  cntThreads.l
  th32ParentProcessID.l
  pcPriClassBase.l
  dwFlags.l
  szExeFile.c[#MAX_PATH]
EndStructure

Prototype.l Process32FirstW(hSnapshot.l, *PROCESSENTRY32W)

Library = OpenLibrary(0,"kernel32.dll")
Global Process32FirstW.Process32FirstW = GetFunction(0,"Process32FirstW")
CloseLibrary(0) 
 

Procedure GetPID(ProcessName.s)
  hSnapShot = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS,#Null)

  If hSnapShot
   
    iResult = -1
    pInfo.PROCESSENTRY32W
    pInfo\dwsize    = SizeOf(PROCESSENTRY32W)
    bProcAvailable  = Process32FirstW(hSnapShot, @pInfo)
    Debug ShowError()
    
    While(bProcAvailable) And (Not iResult = 0)
      bProcAvailable = Process32Next_(hSnapShot, @pInfo)
      iResult = CompareMemoryString(@pInfo\szExeFile,@ProcessName,1) 
    Wend
   
    CloseHandle_(hSnapShot)
   
    ProcedureReturn pInfo\th32ProcessID
   
  EndIf
EndProcedure

Debug GetPID("explorer.exe")


PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Unicode Process32First

Beitrag von Danilo »

Probier mal mit dieser Strukture:

Code: Alles auswählen

Procedure.s ShowError ()
  error = GetLastError_ ()
  Debug error
  If error
    *MemoryID = AllocateMemory (255)
    length = FormatMessage_ (#FORMAT_MESSAGE_FROM_SYSTEM, #Null, error, 0, *MemoryID, 255, #Null)
    If length > 1 ; Some error messages are "" + Chr (13) + Chr (10)... stoopid M$... :(
        e$ = PeekS (*MemoryID, length - 2)
    Else
        e$ = "Unknown error!"
    EndIf
    ;FreeMemory (0)
    ProcedureReturn e$
  Else
    ProcedureReturn "No error has occurred!"
  EndIf
EndProcedure




Structure PROCESSENTRY32_
  dwSize.l
  cntUsage.l
  th32ProcessID.l
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    fill1.l
  CompilerEndIf
  *th32DefaultHeapID
  th32ModuleID.l
  cntThreads.l
  th32ParentProcessID.l
  pcPriClassBase.l
  dwFlags.l
  szExeFile.c[#MAX_PATH]
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    fill2.l
  CompilerEndIf
EndStructure

;Prototype.l Process32FirstW(hSnapshot.l, *PROCESSENTRY32W)

;Library = OpenLibrary(0,"kernel32.dll")
;Global Process32FirstW.Process32FirstW = GetFunction(0,"Process32FirstW")
;CloseLibrary(0)


Procedure GetPID(ProcessName.s)
  hSnapShot = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS,#Null)

  If hSnapShot
   
    iResult = -1
    pInfo.PROCESSENTRY32_
    Debug SizeOf(PROCESSENTRY32_)
    pInfo\dwsize    = SizeOf(PROCESSENTRY32_)
    bProcAvailable  = Process32First_(hSnapShot, @pInfo)
    Debug ShowError()
   
    While(bProcAvailable) And (Not iResult = 0)
      bProcAvailable = Process32Next_(hSnapShot, @pInfo)
      Debug PeekS(@pInfo\szExeFile)
      iResult = CompareMemoryString(@pInfo\szExeFile,@ProcessName,1)
    Wend
   
    CloseHandle_(hSnapShot)
   
    ProcedureReturn pInfo\th32ProcessID
   
  EndIf
EndProcedure

Debug GetPID("explorer.exe")
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Unicode Process32First

Beitrag von NicTheQuick »

Danilo,

ist es nicht eher so, dass für die ProcessId dann einfach ein Integer hin sollte?

Code: Alles auswählen

Structure PROCESSENTRY32_
  dwSize.l
  cntUsage.l
  th32ProcessID.i
  *th32DefaultHeapID
  th32ModuleID.l
  cntThreads.l
  th32ParentProcessID.l
  pcPriClassBase.l
  dwFlags.l
  szExeFile.c[#MAX_PATH]
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    fill2.l
  CompilerEndIf
EndStructure
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Unicode Process32First

Beitrag von Danilo »

NicTheQuick hat geschrieben:Danilo,

ist es nicht eher so, dass für die ProcessId dann einfach ein Integer hin sollte?
Nein, das Fill1.l ist wegen dem Alignment vom nachfolgenden *th32DefaultHeapID auf x64 da.
Siehe Strukturviewer in PB x64 -> PROCESSENTRY32 -> PB_Alignment.b[4].

Auf x64 müssen Strukturen so Aligned sein:
1.) Die ganze Struktur muß so aligned sein wie der größte Typ in der Struktur. (Hier *th32DefaultHeapID, somit Align 8 )
2.) Jeder Typ innerhalb der Struktur muß laut seiner Größe aligned werden. (deshalb das Fill1 um *th32DefaultHeapID auf Align 8 zu schieben)
3.) Die ganze Struktur muß ein multiples des größten Aligns sein, also hier durch 8 teilbar sein. (deshalb das Fill2 am Ende)

Also auf x64 ein Fehler in der PB-Struktur PROCESSENTRY32.
Gemeldet im englischen Forum: WinAPI structure PROCESSENTRY32 wrong
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: Unicode Process32First

Beitrag von _JON_ »

Wow, danke Danilo funktioniert perfekt.

Und nochmal ein riesen Dank für die Erklärung der Alignment :allright:
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Antworten