Autor |
Beitrag |
Hybrid666
      
Beiträge: 26
|
Verfasst: So 15.02.09 18:15
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
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: 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!
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 
      
Beiträge: 26
|
Verfasst: 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
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: So 15.02.09 18:43
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Hybrid666 
      
Beiträge: 26
|
Verfasst: 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
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: So 15.02.09 18:54
Achso, verstehe. Gut, da hab ich keine Ahnung
Ich frage mich, ob's sowas gibt; ob sowas rein von der Windows-Struktur überhaupt möglich ist. 
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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. Aber wie gesagt: Ich hatte das zwar getestet, aber eigentlich sollte das so nicht unbedingt funktionieren, tut es aber doch.
Es ist aber eigentlich die falsche Herangehensweise. 
|
|
Hybrid666 
      
Beiträge: 26
|
Verfasst: So 15.02.09 19:24
werd ich nacher definitiv dann mal ausprobieren. danke!
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: 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
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
|