Seite 1 von 1
Unicode Process32First
Verfasst: 16.11.2011 21:34
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?
Re: Unicode Process32First
Verfasst: 17.11.2011 09:25
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...
Re: Unicode Process32First
Verfasst: 17.11.2011 20:11
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")
Re: Unicode Process32First
Verfasst: 17.11.2011 21:44
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")
Re: Unicode Process32First
Verfasst: 18.11.2011 00:54
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
Re: Unicode Process32First
Verfasst: 18.11.2011 08:50
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
Re: Unicode Process32First
Verfasst: 18.11.2011 20:51
von _JON_
Wow, danke Danilo funktioniert perfekt.
Und nochmal ein riesen Dank für die Erklärung der Alignment
