Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

Diskuze: Delphi

Ostatní jazyky Delphi Delphi (Pascal) Delphi

Aktivity (1)
Avatar
Bimbo
Člen
Avatar
Bimbo:5. října 7:40

Zdravím Vás a přejí krasný den ;-)
Muže mi někdo vysvětlit proč to nefunguje?

procedure TForm1.Button1Click(Sender: TObject);
var
  WndHandle : HWND;
  begin
    WndHandle := FindWindow('VCDS',Nil);
  if WndHandle = 0 then
    begin
     ShowMessage('Nenalezeno');
    end
  else
  begin
     ShowMessage('Nalezeno');
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
WndHandle : HWND;
begin
WndHandle := FindWindow('NOTEPAD',Nil);
  if WndHandle = 0 then
    begin
     ShowMessage('Nenalezeno');
    end
  else
  begin
     ShowMessage('Nalezeno');
  end;

VCDS nenalezeno
NOTEPAD nalezeno

Editováno 5. října 7:42
 
Odpovědět 5. října 7:40
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Bimbo
Martin Dráb:5. října 10:56

Pokud hledáš okno podle jeho názvu (titulku), specifikuj jej jako druhý parametr funkce FindWindows. První parametr je interpretován jako třída okna. Čirou náhodou má Poznámkový blok tu třídu takto pojmenovanou.

Viz dokumentace
https://msdn.microsoft.com/…=vs.85).aspx

Nahoru Odpovědět 5. října 10:56
2 + 2 = 5 for extremely large values of 2
Avatar
Bimbo
Člen
Avatar
Odpovídá na Martin Dráb
Bimbo:5. října 11:24

Neřeším poznámkový blok, ten to najde.
Nenajde to ten VCDS
Takto nenajde paní ten notepad.
WndHandle := FindWindow(Nil,'NO­TEPAD');
http://www.swissdelphicenter.ch/en/showcode.php?…

 
Nahoru Odpovědět 5. října 11:24
Avatar
Bimbo
Člen
Avatar
Bimbo:5. října 11:41
procedure TForm1.Button4Click(Sender: TObject);
var
    hWordWindow: HWND;
  begin
    hWordWindow := FindWindow ('NOTEPAD', nil);
    ShowWindow(hWordWindow, SW_HIDE);
    Sleep(2000);
    ShowWindow(hWordWindow, SW_SHOW);
  end;

procedure TForm1.Button5Click(Sender: TObject);
 var
    hWordWindow: HWND;
  begin
    hWordWindow := FindWindow ('VCDS', nil);
    ShowWindow(hWordWindow, SW_HIDE);
    Sleep(2000);
    ShowWindow(hWordWindow, SW_SHOW);
  end;

Oba dva programy mam spuštěne a v pamětí je vidím.
Notepad jde do hide a ten druhý ne.
Proč?

 
Nahoru Odpovědět 5. října 11:41
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Bimbo
Martin Dráb:5. října 13:47

No a jakou tedy vrací FindWindow v tom negativním případě chybu (GetLastError)? Je to dané okno vlastněno programem s vyššími nebo stejnými právy oproti tomu, který volá FindWIndow?

Nahoru Odpovědět 5. října 13:47
2 + 2 = 5 for extremely large values of 2
Avatar
Bimbo
Člen
Avatar
Bimbo:5. října 14:00

Je to normální exe program, který má na obrazovce form.
Vrací to "neplatný popisovač okna".

 
Nahoru Odpovědět 5. října 14:00
Avatar
Bimbo
Člen
Avatar
Bimbo:5. října 14:31

Něco dělám špatně nebo jsem to špatně pochopil :-(
Ono mi to funguje jen u toho notepadu.

Když to zkouším na jakýkoliv jiný exe soubor tak to vyhazuje to "neplatný popisovač okna"
Proč?

 
Nahoru Odpovědět 5. října 14:31
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Bimbo
Martin Dráb:5. října 14:55

FindWindow vrací "neplatný popisovač okna", nebo tuto chybu vrací ShowWindows?

A zkoušel jsi hledat i podle titulku okna (což je ten druhý parametr FindWIndow), nejen podle třídy? Jistě, pak to nenajde přímo notepad, protože titulek jeho okna může být různý (závisí mj. na souboru, který je v něm otevřený), a proto jej v tom odkazovaném článku hledají prostě tak, že projdou všechna okna aplikace a dívají se na okna, co v titulku obsahují řetězec notepad.

Nahoru Odpovědět 5. října 14:55
2 + 2 = 5 for extremely large values of 2
Avatar
Bimbo
Člen
Avatar
Bimbo:5. října 15:29

Vypadá to že se v tom pořádně zaplavávám. :-(
Poradite?
O co mi jde.
Je exe program, spustím ho.
winhex - memory - a najdu si ho a načtu.
Jsou tam řetězce.
Třeba 38-Roof Electronics

Chtěl bych aby můj program tento řetězec vyhledal a přepsal.

Editováno 5. října 15:32
 
Nahoru Odpovědět 5. října 15:29
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Bimbo
Martin Dráb:5. října 22:27

Pokud to chceš celé automatizovat (a jen případně zadávat řetězce, které chceš přepsat), tak postup je následunící:

  1. Získat handle cílového procesu s oprávněními PROCESS_VM_OPE­RATION, PROCESS_VM_READ, PROCESS_VM_WRITE a PROCESS_QUERY_IN­FORMATION (funkce OpenProcess).
  2. Zjistit, jaké části adresového prostoru procesu jsou tvořeny pamětí, kterou lze číst (VirtualQueryEx).
  3. Postupně tyto oblasti číst (ReadProcessMe­mory) a vyhledávat v nich požadované řetězce.
  4. Nalezené řetězce upravovat (WriteProcessMe­mory... není třeba přes VirtualProtextEx povolovat možnost zápisu, WriteProcessMemory to dělá interně sama).
  5. Po dokončené práci zrušit handle procesu (CloseHandle).
Nahoru Odpovědět 5. října 22:27
2 + 2 = 5 for extremely large values of 2
Avatar
Bimbo
Člen
Avatar
Bimbo:12. října 8:02

Tak fungovat to funguje.
Ještě by byl dotaz.
Mam 2 verze stejného programu (32 a 64 bit)
U 32 bit je to ok.
U 64 bit mi to nedovolí přepsat.
Důvod je že resource je úplně na jiné adrese a vyhodí mi to system error code 998 (nepřestupný přístup k paměťovému místu).
Jde to nějak pořešít?

Editováno 12. října 8:03
 
Nahoru Odpovědět 12. října 8:02
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Bimbo
Martin Dráb:12. října 17:10

Z 32bitového procesu se rozumně nedá přepisovat paměť 64bitového (opačně to lze). Myslím, že existuje nějaká málo dokumentovaná (pokud vůbec) funkce, jak může 32bitový proces číst paměť 64bitového, ale to je asi tak všechno.

Řešení je jednoduché – prostě budeš mít dvě binárky tvé aplikace, jednu pro 32bitová a jednu pro 64bitová Windows.

Ale nejsem si úplně jistý, zda jsem pochopil, na co se ptáš, je to tak trošku výzva :-).

Nahoru Odpovědět 12. října 17:10
2 + 2 = 5 for extremely large values of 2
Avatar
Bimbo
Člen
Avatar
Bimbo:18. října 0:51

Děkují moc, funguje ;-)
Bych měl ještě poslední.
Když bych chtěl v delphi jen nahrát exe program do pamětí, pak ho upravit a pak teprve spustit.
Půjde to?

 
Nahoru Odpovědět 18. října 0:51
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Bimbo
Martin Dráb:18. října 1:29

Ano. Otázka je, jaké zpravy toho exe souboru máš na mysli (tzn. jak moc bude potřeba v paměti měnit strukturu).

Pokud bys strukturu měnit moc nepotřeboval, můžeš ten soubor namapovat za pomoci OS (tzn. oddře za tebe většinu práce) skrz CreateFile -> CreateFIleMapping se SEC_IMAGE*** --> MapViewOfFile. Pokud budeš chtít měnit oblasti, který jsou mapovány jen pro čtení, tak bude třeba použít VirtualProtect pro změnu oprávnění (stálo by za pokus ale zkusit WriteProcessMe­mory na tyto oblasti ve vlastním procesu).

Pokud se jedná o větší modifikace, tak si asi budeš muset provést celé načítání toho EXE souboru sám (tzn. většinu úprav, kterou systém dělá, když načítá spustitelný soubor do paměti – protože tyhle soubory vypadají v paměti jinak než na disku).

Nahoru Odpovědět 18. října 1:29
2 + 2 = 5 for extremely large values of 2
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.