AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi TlHelp32 - "SnapModule32" nicht enthalten???

TlHelp32 - "SnapModule32" nicht enthalten???

Ein Thema von hhhuut · begonnen am 17. Nov 2014 · letzter Beitrag vom 14. Mai 2015
Antwort Antwort
hhhuut
(Gast)

n/a Beiträge
 
#1

TlHelp32 - "SnapModule32" nicht enthalten???

  Alt 17. Nov 2014, 20:45
Delphi-Version: XE5
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:
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;
Die EXE aus der diese Prozedur aufgerufen wird compiliere ich als 64bit. Allerdings werden nun entsprechend nur geladene 64bit Module eines Prozesses angezeigt.
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:
// 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
In der C++ Headerdatei (TlHelp32.h) ist er aber noch angegeben.
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: TlHelp32 - "SnapModule32" nicht enthalten???

  Alt 17. Nov 2014, 22:03
Ergänze die Konstante doch einfach in deinem Code.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
hhhuut
(Gast)

n/a Beiträge
 
#3

AW: TlHelp32 - "SnapModule32" nicht enthalten???

  Alt 17. Nov 2014, 22:22
Ich hätte nicht gedacht, dass es tatsächlich so einfach ist. Jetzt läuft alles perfekt.
Vielen vielen Dank dafür!
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#4

AW: TlHelp32 - "SnapModule32" nicht enthalten???

  Alt 12. Mai 2015, 19:49
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.
  Mit Zitat antworten Zitat
hhhuut
(Gast)

n/a Beiträge
 
#5

AW: TlHelp32 - "SnapModule32" nicht enthalten???

  Alt 12. Mai 2015, 20:32
Welcher (64-Bit-?)Prozeß hat denn 32-Bit-Module geladen, hhhuut und ggf. auch die anderen?
Du hast das glaube ich ein wenig falsch verstanden. Es geht darum, dass wenn ich die EXE mit obenstehender Prozedur als 32bit compiliere, dann zeigt das Programm, wenn ich einen 32bit-Prozess auswähle, alle geladenen Module an. Wenn ich einen 64bit-Prozess auswähle, dann zeigt es nichts an, da 32bit Programme nicht berechtigt sind, in irgendeiner Weise mit 64bit Programmen zu interagieren.

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;
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#6

AW: TlHelp32 - "SnapModule32" nicht enthalten???

  Alt 12. Mai 2015, 20:42
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.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#7

AW: TlHelp32 - "SnapModule32" nicht enthalten???

  Alt 12. Mai 2015, 21:12
@hhhuut: Kleiner Tip: Objekte, die einer Methode/Funktion/Prozedur als Parameter übergeben werden, nicht mit var deklarieren sondern mit const . 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 var 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 const schützt vor einer versehentlichen Zuweisung des Objekts (und eine Kompilierung ist nicht möglich, sollte man es doch versuchen).

MfG Dalai

Geändert von Dalai (12. Mai 2015 um 21:42 Uhr)
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#8

AW: TlHelp32 - "SnapModule32" nicht enthalten???

  Alt 14. Mai 2015, 17:20
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 hier.

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.

Geändert von Delphi-Laie (14. Mai 2015 um 20:20 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz