Entwickler-Ecke
Windows API - Handle des ausführenden Prozesses
Hybrid666 - So 15.02.09 18:15
Titel: Handle des ausführenden Prozesses
Servus,
ich schreib grade ein kleines tool, welches sich einigen selbstgeschriebenen DLLs bemächtigt. Nun muss ich in einer DLL per SendMessage etwas ans Hauptfenster schicken, will das Fenster wenn möglich nicht mittels FindWindows suchen, da sich der Fenstertext ändern kann. Kann ich in der DLL irgendwie rausfinden welcher prozess die DLL geladen hat bzw das Handle zu diesem Prozess?
Wär supi wenn da einer was weiß.
MfG
JayEff - So 15.02.09 18:26
Man könnte der DLL eine Initialisierungsprozedur verpassen und dieser das Handle mitschicken... MyDLLInit(self.Handle); Innerhalb der DLL müsste dann das Handle zwischengespeichert werden, aber ich weiß nicht, wie man das Handle dann DLL-Intern speichern könnte, bzw. ob sich dazu eine simple globale Variable eignet - wer weiß schon, wie lang eine DLL im Speicher liegt! :shock:
Ich weiß aber, dass das so möglich sein müsste, da die bass.dll es so macht: BASS_Init(-1, 44100, 0, Form1.handle, nil)
Hybrid666 - So 15.02.09 18:34
jo das hatte ich mir auch überlegt, da die dll im speicher bleibt, könnte man ne globale nehmen, aber will ich net...müsstest du auch wissen das wir in joytoany keine initialisierungen für die dlls wollen, oder ;).
Gibts da nen anderen weg?
MfG
JayEff - So 15.02.09 18:43
Hybrid666 hat folgendes geschrieben : |
| müsstest du auch wissen das wir in joytoany keine initialisierungen für die dlls wollen, oder ;) |
:mrgreen:
Was genau stellst du dir denn vor, wodurch wird der DLL gesagt, schick an JoyToAny ne Nachricht? Die DLL soll die API darstellen, oder? Nimmt man für eine API nicht normalerweise eine Unit wie Gausi das mit dem Nemp macht, keine kompilierte DLL?
Soll doch der Anwender der API das Handle rausfinden und der DLL geben :nixweiss: Ich kenne keine andere Möglichkeit, das Handle rauszufinden, ausser per ShellExecuteEx das Programm selber zu starten :mrgreen:
Hybrid666 - So 15.02.09 18:49
das hat keinen millimeter was mit der API zu tun o_O für die API gibbet die API Dokumentation. Ich schreib grade nurn neues plugin dafür, welches das handle braucht, aber da ich in der neuen version nu die versionsnummer im title hab, verändert sich bei der nächsten version der windowtitle und man muss die DLLs versionsabhängig kompilieren. also wäre ne methode, mit der ich aus der dll das handle des aufrufenden prozesses bekomm doch wohl schlichtweg geeigneter...
JayEff - So 15.02.09 18:54
Achso, verstehe. Gut, da hab ich keine Ahnung :zustimm:
Ich frage mich, ob's sowas gibt; ob sowas rein von der Windows-Struktur überhaupt möglich ist. :nixweiss:
jaenicke - So 15.02.09 19:04
Dafür muss man wohl alle Prozesse durchgehen und schauen welcher davon die eigenen DLL geladen hat. Einen entsprechenden (anscheinend funktionierenden aber unsauberen) Versuch hatte ich in einer ähnlichen Frage vor ein paar Wochen
gepostet [
http://www.delphi-forum.de/viewtopic.php?p=539869#539869]. Aber wie gesagt: Ich hatte das zwar getestet, aber eigentlich sollte das so nicht unbedingt funktionieren, tut es aber doch. :mrgreen:
Es ist aber eigentlich die falsche Herangehensweise. :nixweiss:
Hybrid666 - So 15.02.09 19:24
werd ich nacher definitiv dann mal ausprobieren. danke!
uall@ogc - Fr 20.02.09 20:32
Spontan fällt mir auch nur
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| function EnumWindowsProc(hwnd: Thandle; lParam: Integer): Boolean; stdcall; var processid: Cardinal; begin Result := True; if (GetWindowThreadProcessId(hwnd, processid) <> 0) then if (processid = GetCurrentProcessID) then begin Result := False; MessageBoxA(0,PChar(Format('%d :: %d',[hwnd, form1.handle])),nil,0); end; end;
procedure TForm1.Button1Click(Sender: TObject); begin EnumWindows(@EnumWindowsProc, 0); end; |
ein. Aber da bekommt man dann wohl mehere Fenster zurück
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!