![]() |
DLL - Problem
Ich habe folgendes Problem.
Wenn ein User mit einem meiner Programme arbeitet , dann muß er meistens gleichzeitig noch mit anderen Programmen wie Word etc arbeiten. Deshalb habe ich versucht einen Hook zu programmieren, der dem User zb. über Messageboxen während er in dem anderen Programm arbeitet Hinweise gibt. Hier erstmal der Code in meinem Programm, das die DLL aufruft:
Delphi-Quellcode:
In diesem Fall wird Word neu gestartet, weil ich das ganze erstmal testen will...später suche ich mir dann das richtige Process-Handle...
CreateProcessA(nil,'C:\Programme\Microsoft Office\Word.exe',nil,nil,False,CREATE_SUSPENDED,nil,nil,StartupInfo,ProcessInfo);
ResumeThread(ProcessInfo.hThread); Sleep(5000); Lib:=LoadLibrary(ServerName); Proc:=GetProcAddress(Lib,'pseduo'); SetWindowsHookEx(WH_GETMESSAGE,Proc,Lib,ProcessInfo.dwThreadId); Sleep(1000); CloseHandle(ProcessInfo.hThread); CloseHandle(ProcessInfo.hProcess); ExitProcess(0); Der Code in der DLL sieht so aus:
Delphi-Quellcode:
In diesem Fall soll lediglich in Word eine Messagebox angezeigt werden in der der Name des aktuellen Process angezeigt wird, damit ich sehe ob die Messagebox im Kontext von Word oder von meinem Programm läuft. Das Ergebnis sieht so aus das die Messagebox zuerst im Kontext von meinem Programm angezeigt wird (zb. Text: MeinProgramm.exe) und wenn ich mit Ok bestätigt habe dann sofort im Kontext von Word (Text: Word.exe). Was mache ich falsch, ich möchte natürlich nicht das alle Aktionen 2 mal durchgeführt werden sondern immer nur im kontext des Programms in das ich die DLL lade (also in diesem Fall Word). Kann mir jemand weiterhelfen?
procedure EntryPoint(Reason:Integer);
var IP:PChar; TID:DWORD; begin case Reason of DLL_THREAD_ATTACH: begin Showmessage (extractfilename(paramstr(0))); end; DLL_THREAD_DETACH: begin end; end; end; procedure pseduo; begin end; exports pseduo; begin DLLProc:=@EntryPoint; EntryPoint(DLL_THREAD_ATTACH); end. PS: Das DLL und Hook-Tut habe ich mir schon durchgelesen aber bei der Sache hier komm ich irgendwie nicht weiter... |
Re: DLL - Problem
Mein Vorschlag:
Entweder du nimmst eine andere Hooking Methode, oder du findest z.B. so:
Delphi-Quellcode:
den Dateinamen der Anwendung heraus, die gerade die Message empängt (sollte funzen), oder ...
function GetFileName: string;
var Buffer : array[0..254] of Char; begin GetModuleFilename(hinstance, @Buffer[0], 255); Result := Buffer; end; du findest einen anderen weg ^^ Ein Problem sehe ich allerdings in dieser Zeile: ShowMessage(...); ShowMessage ist soweit ich das weis eine VCL funktion. Man sollte wohl doch lieber MessageBox(...) verwenden ... ciao, Philipp |
Re: DLL - Problem
Danke für die Antwort! Welche andere Hooking Methode könnte ich denn verwenden? Also es geht mir eigentlich um folgendes: Ich möchte mit meinem Programm die DLL nur starten, damit Sie unter dem Namen des anderen Programms Befehle ausführt, zb. die Messagebox aber auch andere. Die DLL muss auch keine Werte an mein Programm zurückgeben oder auf Eingaben von meinem Programm warten, Es geht nur darum das mein Programm mit CreateProcess zb. Word startet und die DLL dann in den Process läd. Wie könnte ich das denn am besten hinkriegen?
|
Re: DLL - Problem
Zitat:
Zitat:
(wenn in der Anwendung kein neuer Thread erzeugt wird, erscheint auch keine MessageBox). |
Re: DLL - Problem
Warum laesst du denn nicht Word die DLL laden?
Ein kleines Makro sollte das erledigen. |
Re: DLL - Problem
Ich glaube das mit dem Makro bringt in dem Fall nichts weil es ja auch um andere Programme als Word geht in die die DLL geladen werden soll. Ich hab das Flag Create_Suspended jetzt einfach mit nil ersetzt und vor dem injezieren mit waitforinputidle gewartet. Jetzt wird die Messagebox aber nur noch im Namen meines Programms geöffnet (messageboxtext: MeinProgramm.exe) :gruebel: Weiß langsam echt nicht mehr was ich falsch mache :cry:
|
Re: DLL - Problem
Kann es sein, das du eigentlich den WH_GETMESSAGE Hook nicht benötigst, und damit nur versuchst dich in eine andere Anwendung einzuschleusen? Wenn ja, kannst du dies auch mit der InjectLibrary -Funktion der MadCodeHook-Lib tun. Damit wird dann deine DLL von dem Programm geladen, in das du sie injezierst, und DLL-Proc mit DLL_PROCESS_ATTACH aufgerufen. Da könntest du dann einen Thread starten, und im hintergrund des Programmes arbeiten.
Kommt aber natürlich ganz auf den Anwendungsbereich an, den ich aber ned kenn ... ^^ ciao, Philipp |
Re: DLL - Problem
@c113plpbr
Danke :) ich werd mir die Lib gleich mal anschauen, ich glaub das ist genau das was ich gesucht habe... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz