![]() |
Delphi-Version: XE5
TlHelp32 - "SnapModule32" nicht enthalten???
Hallo liebe DP-Community,
Ich stehe gerade vor einem Problem: Ich habe mir folgende Prozedur geschrieben, die alle geladenen Module eines Prozesses anzeigen soll:
Delphi-Quellcode:
Die EXE aus der diese Prozedur aufgerufen wird compiliere ich als 64bit. Allerdings werden nun entsprechend nur geladene 64bit Module eines Prozesses angezeigt.
procedure ListProcessModules(cThreadID: Cardinal; var SL: TStringList);
var Snapshot: THandle; Module: TModuleEntry32; begin Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, cThreadID); if (Snapshot <> 0) and (Snapshot <> INVALID_HANDLE_VALUE) then begin try ZeroMemory(@Module, SizeOf(TModuleEntry32)); Module.dwSize := SizeOf(TModuleEntry32); if Module32First(Snapshot, Module) then repeat SL.Add(StrPas(Module.szModule)); until not Module32Next(Snapshot, Module); finally CloseHandle(Snapshot); end; end; end; Nach ein wenig Sucherei habe ich dann herausgefunden, dass ich statt/zusätzlich zu "TH32CS_SNAPMODULE" noch den Parameter "TH32CS_SNAPMODULE32" angeben müsste. Das Problem ist, dass Delphi diesen Paramter in der Unit TlHelp32.pas nicht findet!
Delphi-Quellcode:
In der C++ Headerdatei (TlHelp32.h) ist er aber noch angegeben.
// dwFlags
// const {$EXTERNALSYM TH32CS_SNAPHEAPLIST} TH32CS_SNAPHEAPLIST = $00000001; {$EXTERNALSYM TH32CS_SNAPPROCESS} TH32CS_SNAPPROCESS = $00000002; {$EXTERNALSYM TH32CS_SNAPTHREAD} TH32CS_SNAPTHREAD = $00000004; {$EXTERNALSYM TH32CS_SNAPMODULE} TH32CS_SNAPMODULE = $00000008; {$EXTERNALSYM TH32CS_SNAPALL} TH32CS_SNAPALL = TH32CS_SNAPHEAPLIST or TH32CS_SNAPPROCESS or TH32CS_SNAPTHREAD or TH32CS_SNAPMODULE; {$EXTERNALSYM TH32CS_INHERIT} TH32CS_INHERIT = $80000000; // // Use CloseHandle to destroy the snapshot Meine Frage wäre jetzt: Hab ich einfach nur eine falsche/kaputte TlHelp32 Unit oder (wenn nicht) weiß jemand, wie ich mit einem 64bit Programm trotzdem 32bit & 64bit Module eines anderen Prozesses mir anzeigen lassen kann? Liebe Grüße Erik P.S.: Ich benutze Delphi XE5 |
AW: TlHelp32 - "SnapModule32" nicht enthalten???
Ergänze die Konstante doch einfach in deinem Code.
|
AW: TlHelp32 - "SnapModule32" nicht enthalten???
Ich hätte nicht gedacht, dass es tatsächlich so einfach ist. Jetzt läuft alles perfekt.
Vielen vielen Dank dafür! |
AW: TlHelp32 - "SnapModule32" nicht enthalten???
Welcher (64-Bit-?)Prozeß hat denn 32-Bit-Module geladen, hhhuut und ggf. auch die anderen?
Ich stehe nämlich auch noch vor dem bis heute für mich ungelösten Rätsel, mir diese 32-Bit-Module anzeigen zu lassen. |
AW: TlHelp32 - "SnapModule32" nicht enthalten???
Zitat:
Wenn ich mein Programm mit obenstehender Prozedur allerdings als 64bit compiliere, dann zeigt das Programm bei einem ausgewählten 64bit-Prozess alle geladenen Module an, bei einem 32bit Prozess allerdings nichts, da es in diesem Fall nur nach 64bit-Modulen sucht, die es bei einem reinen 32bit-Prozess ja nicht gibt. Um meinem 64bit-Programm also zu sagen, dass es auch nach geladenen 32bit-Modulen schauen soll, sodass ich auch bei 32bit-Prozessen die geladenen Module angezeigt bekomme, brauche ich die zusätzliche Konstante "TH32CS_SNAPMODULE32". Die gesamte Prozedur für 64bit sieht also folgendermaßen aus:
Delphi-Quellcode:
procedure ListProcessModules(cThreadID: Cardinal; var SL: TStringList);
var Snapshot: THandle; Module: TModuleEntry32; begin Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE Or TH32CS_SNAPMODULE32, cThreadID); if (Snapshot <> 0) and (Snapshot <> INVALID_HANDLE_VALUE) then begin try ZeroMemory(@Module, SizeOf(TModuleEntry32)); Module.dwSize := SizeOf(TModuleEntry32); if Module32First(Snapshot, Module) then repeat SL.Add(StrPas(Module.szModule)); until not Module32Next(Snapshot, Module); finally CloseHandle(Snapshot); end; end; end; |
AW: TlHelp32 - "SnapModule32" nicht enthalten???
Vielen Dank, das erhellt die Sache für mich ein wenig! Hatte ich wohl tatsächlich falsch verstanden. Ich werde mich demnächst intensiver damit beschäftigen.
|
AW: TlHelp32 - "SnapModule32" nicht enthalten???
@hhhuut: Kleiner Tip: Objekte, die einer Methode/Funktion/Prozedur als Parameter übergeben werden, nicht mit
Delphi-Quellcode:
deklarieren sondern mit
var
Delphi-Quellcode:
. Warum? Das Objekt selbst soll ja konstant bleiben. Die Inhalte, also die Eigenschaften, Ereignisse usw. können aber trotzdem geändert werden. Wenn man die Objektparameter mit
const
Delphi-Quellcode:
deklariert, kann sich auch die Adresse des Objekts ändern, d.h. ein völlig anderes Objekt in der Methode zugewiesen werden, was wohl höchst selten Sinn der Sache ist. Ein
var
Delphi-Quellcode:
schützt vor einer versehentlichen Zuweisung des Objekts (und eine Kompilierung ist nicht möglich, sollte man es doch versuchen).
const
MfG Dalai |
AW: TlHelp32 - "SnapModule32" nicht enthalten???
Die Sache hat sich nun weiter erhellt: Man kann den Parameter TH32CS_SNAPMODULE32 anscheinend nicht separat, sondern nur in Kombination (Disjunktion) mit TH32CS_SNAPMODULE, demnach "TH32CS_SNAPMODULE or TH32CS_SNAPMODULE32" als Argument benutzen.
Ich benutzte ersteren bis dato immer separat und war erstaunt, daß so gar kein Prozeß, auch keiner mit 32 Bit auf 64-Bit-Windows, 32-Bit-Module offenbaren wollte. Danke, hhhuut! Ergänzung: Hinterher ist man immer schlauer, die Lösung meines Problems findet sich auch ![]() Zweite Ergänzung: Mein Englisch reicht aus, um zu erkennen, daß Winzigweich sich mit "This flag can be combined with TH32CS_SNAPMODULE or TH32CS_SNAPALL." unklar und mißverständlich ausdrückte. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz