procedure TForm1.GetData(ComponentName:
string; SearchType : TSearchtype);
var mem:TMemory;
lib:THandle;
size:integer;
process:cardinal;
processid:cardinal;
procmem:PMemory;
tmp:cardinal;
threadID:cardinal;
thread:THandle;
begin
memo1.clear;
myhandle:=findwindow(
nil,'
PImage');
//Beispielprogramm finden
if myhandle=0
then exit;
//mem ist der Record der nachher in den anderen Process kopiert wird
mem.backwnd:=self.Handle;
//Handle, damit wir Nachrichten zurückschicken können
mem.backmsg:=mymsg;
//Message-Nr., damit wir unsere Message wiederfinden
mem.watchwnd:=myhandle;
//Das Handle für getwindowlong
mem.count:=6;
//welches TControl (=mem.vgl)? (nur für Searchtype=sClassName)
StrPCopy(@mem.vgl,ComponentName);
mem.vgllength:=Length(ComponentName);
//Länge des Vergleichsstrings
mem.SearchType:=SearchType;
//vgl vergleichen mit Classname oder Name oder Caption zurücksenden
//kopieren der funktion injectthread in den Record
size:=integer(@endpoint)-integer(@injectThread);
move(injectthread,mem.thread,size);
//EinsprungAdresse von 3 WinAPI-funktionen, die nacher benötigt werden
//Die Adressen sind in jedem Process gleich
lib:=getmodulehandle('
user32.dll');
mem.Postmessage:=getprocaddress(lib,'
PostMessageA');
mem.getwindowlong:=getprocaddress(lib,'
GetWindowLongA');
lib:=getmodulehandle('
kernel32.dll');
mem.exitthread:=getprocaddress(lib,'
ExitThread');
//Thread-Record in anderen Process kopieren und mem.Thread starten
getwindowthreadprocessid(myhandle,@processid);
process:=openprocess(PROCESS_ALL_ACCESS,false,processid);
//Speicher reservieren
procmem:=virtualallocex(process,
nil,sizeof(Tmemory),MEM_COMMIT,PAGE_EXECUTE_READWRITE);
//Kopieren
writeprocessmemory(process,procmem,@mem,sizeof(TMemory),tmp);
//Starten
thread:=createremotethread(process,
nil,0,@procmem.thread,procmem,0,threadid);
//Warten bis injectthread beendet ist
waitforsingleobject(thread,infinite);
//Speicher wieder freigeben
closehandle(thread);
virtualfreeex(process,procmem,0,mem_decommit);
closehandle(process);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
GetData(Edit1.Text,sName);
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
GetData(Edit2.Text,sCaption);
end;