AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi CreateWindow('Static'... aus injizierter DLL
Thema durchsuchen
Ansicht
Themen-Optionen

CreateWindow('Static'... aus injizierter DLL

Ein Thema von Kati2608 · begonnen am 30. Okt 2007 · letzter Beitrag vom 2. Nov 2007
Antwort Antwort
Kati2608

Registriert seit: 30. Okt 2007
3 Beiträge
 
#1

CreateWindow('Static'... aus injizierter DLL

  Alt 30. Okt 2007, 16:06
Hallo Leute,

ich habe da ein Problem bei der mir bisher noch keiner helfen konnte...

Und zwar injiziere ich eine DLL in ein anderes Programm (in diesem Beispiel zu Testzwecken in Notepad). Aus dieser DLL heraus soll dann in Notepad mittels CreateWindow ein Static Control angezeigt werden. Das funktioniert auch super... Das Problem ist nur, dass das Control sofort wieder verschwindet, es wird nur den Bruchteil einer Sekunde angezeigt.

Getestet habe ich das ganze auch mit einem Fenster welches anstatt des Static Controls angezeigt wird, aber auch da verschwindet das Fenster sofort wieder...

Wenn ich das ganze in einem normalen Programm versuche klappt es so wie gewünscht... Das Fenster bzw. Control wird so angezeigt wie es sein soll. Nur eben aus der DLL nicht.

Weiß einer Rat?

Liebe Grüße,
Kati

Code der DLL (Static):
Delphi-Quellcode:
uses
  SysUtils, Classes, Windows, Messages, ShareMem;

{$R *.res}


Procedure Init(); stdcall;
var hMain: HWND;
  WndDC: HDC;
  MyFont: HWND;
begin
  hMain := FindWindow('notepad',nil);
  if (hMain <> 0) then
  begin
    MyFont := CreateFont( -11, 0, 0, 0, 0, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, 'MS Sans Serif');
    WndDC := CreateWindow('Static', 'lbltest', WS_VISIBLE or WS_CHILD, 10, 10, 250, 14, hMain, 0, 0, nil);
    SendMessage(WndDC, WM_SETFONT, Integer(MyFont), Integer(true));
  end;
end;


Procedure EntryPoint(dwReason: Integer); stdcall;
begin
case dwReason of
    DLL_PROCESS_DETACH: {};
    DLL_PROCESS_ATTACH: Init();
    DLL_THREAD_ATTACH: {};
    DLL_THREAD_DETACH: {};
   end;
end;


begin
 DisableThreadLibraryCalls(hInstance);
 DLLProc := @EntryPoint;
 EntryPoint(DLL_PROCESS_ATTACH);
end.
Code der DLL (Fenster):
Delphi-Quellcode:
library InjectDLL1;


uses
  SysUtils, Classes, Windows, Messages, ShareMem;

{$R *.res}


function RegisterClass: Boolean;
var
  WindowClass: TWndClass;
begin
  WindowClass.Style := CS_HREDRAW or CS_VREDRAW;
  WindowClass.lpfnWndProc := @DefWindowProc;
  WindowClass.cbClsExtra := 0;
  WindowClass.cbWndExtra := 0;
  WindowClass.hInstance := hInstance;
  WindowClass.hIcon := 0;
  WindowClass.hCursor := 0;
  WindowClass.hbrBackground := COLOR_WINDOW;
  WindowClass.lpszMenuName := nil;
  WindowClass.lpszClassName := 'MyWindowClass';
  Result := Windows.RegisterClass(WindowClass) <> 0;
end;


Procedure Init(); stdcall;
var
  hMain: HWND;
  hWindow: HWND;
begin
  hMain := FindWindow('notepad',nil);
  if (hMain <> 0) then
  begin
    if not RegisterClass then
      begin
        MessageBox(0, 'RegisterClass failed...', 'Notepad', MB_OK);
        Exit;
      end;
      hWindow := CreateWindowEx(0, 'MyWindowClass', 'Do you see me?', WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, nil);
      if hWindow <> 0 then
      begin
        ShowWindow(hWindow, SW_SHOWNORMAL);
        UpdateWindow(hWindow);
      end else
      begin
        MessageBox(0, 'CreateWindow failed...', 'Notepad', MB_OK);
        Exit;
      end;
  end;
end;


Procedure EntryPoint(dwReason: Integer); stdcall;
begin
case dwReason of
    DLL_PROCESS_DETACH: {};
    DLL_PROCESS_ATTACH: Init();
    DLL_THREAD_ATTACH: {};
    DLL_THREAD_DETACH: {};
   end;
end;


begin
 DisableThreadLibraryCalls(hInstance);
 DLLProc := @EntryPoint;
 EntryPoint(DLL_PROCESS_ATTACH);
end.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

Re: CreateWindow('Static'... aus injizierter DLL

  Alt 30. Okt 2007, 16:19
Klapt es, wenn du die DllMain aus einem anderen Programm aufrufst, aber nicht injizierst? Und wie injizierst du? CreateRemoteThread?
  Mit Zitat antworten Zitat
Kati2608

Registriert seit: 30. Okt 2007
3 Beiträge
 
#3

Re: CreateWindow('Static'... aus injizierter DLL

  Alt 31. Okt 2007, 18:35
Zitat von Zacherl:
Klapt es, wenn du die DllMain aus einem anderen Programm aufrufst, aber nicht injizierst?
ääähmmm.... Wenn ich das mache passiert garnix... Ohne jegliche Fehlermeldung...
Oder hab ich was falsch gemacht?
Delphi-Quellcode:
implementation
procedure Init(); stdcall;
external 'dll.dll';
procedure EntryPoint(dwReason: Integer); stdcall;
external 'dll.dll';

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  EntryPoint(1);
  //Init();
end;
Der DLL habe ich noch
Delphi-Quellcode:
exports
  EntryPoint, Init;
hinzugefügt.

Zitat von Zacherl:
Und wie injizierst du? CreateRemoteThread?
Das mache ich über die madCHook.dll von madCodeHook

Liebe Grüße,
Kati
  Mit Zitat antworten Zitat
MartinA

Registriert seit: 27. Aug 2003
13 Beiträge
 
#4

Re: CreateWindow('Static'... aus injizierter DLL

  Alt 2. Nov 2007, 12:29
Hallo,

das injizieren scheint ja nicht das Problem zu sein.
Wenn Du das Control bzw. das Form in einen eigenen Thread legst sollte es permanent angezeigt werden.

etwas pseudocode

Delphi-Quellcode:
//zum Erzeugen:
wthreathandle := CreateThread(nil, 0, TFNThreadStartRoutine(@frmmsgThread), nil, 0, ThreadID);

//Zum zerstören:
PostThreadMessage(RTFCont.tid,WM_USER+$FFFF,0,0);

function frmmsgThread(): LongInt; stdcall;
var
  wmsg : tmsg;
  X,i : integer;
  twhwnd : thandle;
begin
try
  twhwnd := getcurrentwindo; // oder einfach übergeben
  RTFCont := tForm1.createparented(twhwnd);
  RTFCont.tid := getcurrentthreadid;
  setparent (RTFCont.Handle,twhwnd);
  RTFCont.show;
  while wMSG.message <> WM_USER+$FFFF do
    begin
      GetMessage(wMsg,0,0,0);
      TranslateMessage(wMsg);
      DispatchMessage(wMsg);
    end;
  RTFCont.free;
except
end;

end;
RTFCont ist ein Form auf dem des Control liegt, in dem Beispiel ein RTF-Control.

Im Prinzip kann man mit diesem, nicht wirklich sauberen, Konstrukt nahezu jedes Delphi-Control in jeder Windwos-Anwendung (Konsolen ausgenommen) platzieren.

Gruß
Martin

[edit=SirThornberry]Code-Tags durch Delphi-Tags ersetzt - Mfg, SirThornberry[/edit]
ALT +F4
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: CreateWindow('Static'... aus injizierter DLL

  Alt 2. Nov 2007, 12:37
für mich klingt das ganze auch danach das zwar das control erzeugt wird aber eben keine Nachrichtenschleife dazu abgearbeitet wird und somit gibt es keine PaintMessages etc. die verarbeitet werden.
Und wenn dann noch der Thread, aus dem es heraus erzeugt wird beendet wird gibt es das Control auch nicht mehr.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
MartinA

Registriert seit: 27. Aug 2003
13 Beiträge
 
#6

Re: CreateWindow('Static'... aus injizierter DLL

  Alt 2. Nov 2007, 12:45
Zitat von SirThornberry:
für mich klingt das ganze auch danach das zwar das control erzeugt wird aber eben keine Nachrichtenschleife dazu abgearbeitet wird und somit gibt es keine PaintMessages etc. die verarbeitet werden.
Und wenn dann noch der Thread, aus dem es heraus erzeugt wird beendet wird gibt es das Control auch nicht mehr.
Vollkommen richtig, Deine Annahme
Deswegen obiges Bsp.

Gruß
Martin
ALT +F4
  Mit Zitat antworten Zitat
Kati2608

Registriert seit: 30. Okt 2007
3 Beiträge
 
#7

Re: CreateWindow('Static'... aus injizierter DLL

  Alt 2. Nov 2007, 14:31
Warum bin ich da nicht gleich drauf gekommen?
Mit GetMessage etc in einer Schleife hatte ich das gestern schon hinbekommen das das Fenster angezeigt wird, allerdings is das Notepad Fenster dann quasi eingefroren, natürlich weil das Threading gefehlt hatte... Manchmal sieht man einfach den Wald vor lauter Bäumen nicht...

Ich werde das später mal testen, und da es funktionieren wird markiere ich den Thread mal als gelöst...

Vielen Dank an euch!!

Liebe Grüße
die glückliche Kati )
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:47 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