Autor Beitrag
DerNetteNachbar Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 224



BeitragVerfasst: Do 18.12.08 17:34 
Joa und nu...den ProzessHandle konnte ich auch damit ermitteln
ausblenden Delphi-Quelltext
1:
2:
 processHandle := OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION,
        False, hprocessID);

Ich brauche ja immernoch das TOP Fenster.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 18.12.08 17:40 
Was soll das TOP-Fenster sein?
DerNetteNachbar Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 224



BeitragVerfasst: Do 18.12.08 17:43 
Das erste Fenster was in der Anwendung aufgerufen wird auch das TOP Level genannt.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 18.12.08 17:46 
Und wodurch zeichnet sich das aus? Ein Flag TOP_WINDOW oder so wäre mir neu.
DerNetteNachbar Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 224



BeitragVerfasst: Do 18.12.08 17:50 
Deshalb auch meine Frage ob es nicht eine Kennzeichnung gibt woran man es festmachen könnte.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 18.12.08 17:52 
Zumindest mir ist keine bekannt.
DerNetteNachbar Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 224



BeitragVerfasst: Do 18.12.08 18:05 
Schade, ich wüsste jetzt nicht wie ich das jetzet realisieren könnte.
DerNetteNachbar Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 224



BeitragVerfasst: Fr 19.12.08 10:37 
PUSH
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 19.12.08 10:58 
Wo liegt denn jetzt noch Dein Problem?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 19.12.08 11:06 
user profile iconDerNetteNachbar hat folgendes geschrieben Zum zitierten Posting springen:
PUSH
Das sind aber kurze 24 Stunden, pushen ist erst dann erlaubt. :roll:

Es gibt nun einmal kaum eine andere gute Möglichkeit als alle Prozesse durchzugehen...
Den Link hast du gesehen...

Du kannst es mit Win32_Process via WMI versuchen, da gibt es ParentProcessId, ich vermute damit macht es auch der ProcessExplorer:
msdn.microsoft.com/e...aa394372(VS.85).aspx
Aber ob das eine so gute Lösung für diesen Zweck ist bin ich mir nicht so sicher. Da bekommst du jedenfalls, wenn das klappt, die ProcessId, und kannst dann die Fenster des Prozesses durchgehen.
Hast du eins gefunden kannst du GetAncestor mit GA_ROOT versuchen um das oberste Parent Window zu finden.

Die schlechteste Lösung wäre, deine Botschaft an alle Fenster, die du mit EnumWindows bekommst zu schicken. Darunter wird auch das deiner Anwendung sein.
Naja, aber da du deine Software ja wohl kaum weitergeben willst (dann würdest du es ja hoffentlich sauber programmieren), kannst du ja auch das machen... Solange du das nicht bei Software machst, die du veröffentlichen willst.

user profile iconDerNetteNachbar hat folgendes geschrieben Zum zitierten Posting springen:
Schade, ich wüsste jetzt nicht wie ich das jetzet realisieren könnte.
Normal :nixweiss:
DerNetteNachbar Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 224



BeitragVerfasst: Fr 19.12.08 11:06 
Naja das Problem ist immer noch das ich die falsche ProzessID bekomme wenn ich in meiner DLL
ausblenden Delphi-Quelltext
1:
2:
GetCurrentProcess() oder
GetWindowThreadProcessID

aufrufe, nämlich die der DLL. Ich möchte aber die ProzessID vom Elternprozess in dem Fall der aufrufende EXE Datei erhalten umso dann auf das MainWindow zu kommen.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 19.12.08 11:12 
GetModuleHandle(nil) sollte laut MSDN das Richtige sein, hat jaenicke doch bereits gepostet.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 19.12.08 11:16 
user profile iconDerNetteNachbar hat folgendes geschrieben Zum zitierten Posting springen:
Da ich aber fest entschlossen bin es auf die Art(API Funktionen) zu machen um mich auch in die API Welt einzuarbeiten
Die einzige sinnvolle Möglichkeit dafür ist selbst in der API Referenz zu suchen, nur dadurch lernst du diese kennen. Und genau das ist das wichtige. Ich kenne nicht alle Funktionen auswendig, ich weiß aber wie ich in der Referenz etwas finde.
Und das lernst du nicht, wenn du um Funktionen zu finden jedesmal nachfragst. :nixweiss:
DerNetteNachbar Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 224



BeitragVerfasst: Fr 19.12.08 11:25 
GetModuleHandle(nil) klappt nicht wirklich, denn es liefert mir ein unbekanntes Handle, das habe ich aber auch schon mal gepostet.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 19.12.08 11:39 
user profile iconDerNetteNachbar hat folgendes geschrieben Zum zitierten Posting springen:
GetModuleHandle(nil) klappt nicht wirklich, denn es liefert mir ein unbekanntes Handle, das habe ich aber auch schon mal gepostet.
Das kann ich nicht reproduzieren. Ich habe es gerade getestet, bei mir ist das Handle gültig. :nixweiss:

Zum Test habe ich GetModuleFileName darauf angewendet, es liefert mir Pfad und Dateiname der Exe, nicht der DLL, also wie es sein soll. Es ist also ein gültiger HInstance Wert. Wie es in der Doku auch steht.
DerNetteNachbar Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 224



BeitragVerfasst: Fr 19.12.08 11:56 
Das ist korrekt ich kriege den Pfad zu den EXE Dateien, allerdings liefert mir diese Funktion zweimal den gleichen Handle Wert. Sprich ich rufe die DLL aus zwei verschiedenen EXE Dateien auf und mir wird immer ein und dasselbe Handle zurückgeliefert. Komischer Verlauf. Ich will aber genau diesen Wert eindeutig haben um diesen im nachhinein zu vergleichen und die Anwendung zu identifizieren.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 19.12.08 12:04 
Also ich habe gerade einen kleinen Test gemacht:
ausblenden DLL
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
function EnumWindowsProc(Hnd: HWND; lParam: LPARAM): Boolean; stdcall;
begin
  Result := GetWindowLong(Hnd, GWL_HINSTANCE) <> GetModuleHandle(nil);
  if not Result then
    SendMessage(GetAncestor(Hnd, GA_ROOT), WM_USER + 10001);

  Result := True; 
    // Damit alle durchgegangen werden, eigentlich
    // gehört die Zeile nicht hier hin!!!
end;

begin
  EnumWindows(@EnumWindowsProc, 0);
end;
ausblenden Programm
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm99.Button1Click(Sender: TObject);
begin
  FreeLibrary(LoadLibrary('Project100.dll'));
end;

procedure TForm99.WndProc(var Msg: TMessage);
begin
  if Msg.Msg = WM_TEST then
    ShowMessage(IntToStr(Msg.LParam))
  else
    inherited;
end;
Jetzt habe ich das Programm mehrfach gestartet, und die MessageBox kam immer genau in dem Programm, das die DLL aufgerufen hat, genau wie es sein soll... :nixweiss:

Und durch die Zeile Result := True; werden ja explizit alle Fenster durchgegangen.
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Sa 20.12.08 17:03 
Also hier werden alle möglichen Dinge vermischt..!
Prozess-Handle != Prozess-ID != Fenster-Handle != Module-Handle

  • Die Prozess-Id ist eine eindeutige Nummer die von Windows an die einzelnen Prozesse vergeben wird - diese erscheint auch im Taskmanager (PID).
  • Ein Prozess-Handle erhält man über OpenProcess. Es handelt sich hierbei um einen Index einer internen Tabelle mit allen Kernel-Objekten des Prozesses. Ein solches Handle ist also immer nur innerhalb des eigenen Prozesses gültig!
  • Ein Fenster-Handle ist eine von Windows vergebene eindeutige Nummer für ein Fenster.
  • Ein Module-Handle ist eigentlich nichts anderes als die Basisadresse des Moduls im entsprechenden Prozessraum.

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 20.12.08 17:41 
Deshalb sollten ja diese beiden Handles innerhalb des Programms gültig sein, die hInstance des Prozesses sollte dann dem (ebenfalls internen) Modulhandle entsprechen.
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden DLL
1:
2:
3:
function EnumWindowsProc(Hnd: HWND; lParam: LPARAM): Boolean; stdcall;
begin
  Result := GetWindowLong(Hnd, GWL_HINSTANCE) <> GetModuleHandle(nil);

Ob das jetzt nur zufällig funktioniert weiß ich nicht, aber die verlinkte Lösung oder eine ganz saubere Lösung stießen ja auf kein Interesse beim Threadersteller. :nixweiss: