Autor Beitrag
Hybrid666
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 26



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: 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(-1441000, Form1.handle, nil)

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Hybrid666 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 26



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: So 15.02.09 18:43 
user profile iconHybrid666 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 26



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: 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
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: 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. :mrgreen:

Es ist aber eigentlich die falsche Herangehensweise. :nixweiss:
Hybrid666 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 26



BeitragVerfasst: So 15.02.09 19:24 
werd ich nacher definitiv dann mal ausprobieren. danke!
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Fr 20.02.09 20:32 
Spontan fällt mir auch nur

ausblenden 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) <> 0then
    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