Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Fremden Befehlszeilenaufruf umbiegen? (https://www.delphipraxis.net/106115-fremden-befehlszeilenaufruf-umbiegen.html)

PeterPanino 5. Jan 2008 19:22


Fremden Befehlszeilenaufruf umbiegen?
 
Hallo, wie kann ich folgendes erreichen: Ein beliebiges anderes Programm ruft eine Befehlszeile (mit einem Parameter) auf, z.B.:

Zitat:

C:\windows\notepad.exe "Irgendeine Textdatei.txt"
Wie kann ich nun diesen Aufruf "umbiegen" von notepad.exe auf ein anderes Programm? (Dabei sollte der übergebene Parameter erhalten bleiben).

STS301 5. Jan 2008 19:26

Re: Fremden Befehlszeilenaufruf umbiegen?
 
ich stehe auf der Leitung, wie wäre es mit OpenDialoge

sirius 5. Jan 2008 19:39

Re: Fremden Befehlszeilenaufruf umbiegen?
 
Du musst den Befehl Shellexecute oder CreateProcess (und nahe Verwandte) hooken. Suche dazu mal uallCollection

DeddyH 5. Jan 2008 19:41

Re: Fremden Befehlszeilenaufruf umbiegen?
 
Wenn ich Dich richtig verstanden habe, willst Du, wenn (z.B.) notepad aufgerufen wird, stattdessen Dein eigenes Programm starten? Dürfte man erfahren, was Du vorhast?

PeterPanino 5. Jan 2008 19:43

Re: Fremden Befehlszeilenaufruf umbiegen?
 
Mmh, ich habe selbst ein bisschen weitergedacht (zuerst dachte ich an so etwas wie ein Systemmomitoring-Hook), aber möglich wäre auch folgendes:

notepad.exe ersetzen durch ein eigenes Programm, das wiederum Notepad aufruft und den übergebenen Parameter an Notepad weitergibt. Nur dann, wenn eine definierte Bedingung erfüllt ist (ein bestimmter Parameter oder ein bestimmtes aufrufendes Programm), wird ein anderes definiertes Programm aufgerufen und diesem der Parameter übergeben. Nur: Wie kann mein Programm erkennen, von welchem Programm es aufgerufen wurde?

DeddyH 5. Jan 2008 19:44

Re: Fremden Befehlszeilenaufruf umbiegen?
 
Sorry, da bin ich überfragt, da müssen andere ran. :(

BenjaminH 5. Jan 2008 19:46

Re: Fremden Befehlszeilenaufruf umbiegen?
 
Wenn du weißt, dass nicht direkt Notepad aufgerufen wurde, sondern eine Textdatei geöffnet wird, könntest du auch die Dateinamenserweiterungen deinem Programm zuordnen.

PeterPanino 5. Jan 2008 19:47

Re: Fremden Befehlszeilenaufruf umbiegen?
 
Zitat:

Zitat von DeddyH
Wenn ich Dich richtig verstanden habe, willst Du, wenn (z.B.) notepad aufgerufen wird, stattdessen Dein eigenes Programm starten? Dürfte man erfahren, was Du vorhast?

Ich möchte einen Workaround für eine bestimmtes Anwendungsprogramm schreiben, das immer NotePad aufruft, um eine bestimmte Konfigurationsdatei zu editieren. Ich möchte nun, dass immer dann (und nur dann), wenn dieses Anwendungsprogramm Notepad die Datei übergibt, stattdessen ein bestimmtes anderes Programm aufgerufen wird, damit ich die Datei in diesem gewünschten Programm bearbeiten kann.

PeterPanino 5. Jan 2008 19:50

Re: Fremden Befehlszeilenaufruf umbiegen?
 
Zitat:

Zitat von BenjaminH
Wenn du weißt, dass nicht direkt Notepad aufgerufen wurde, sondern eine Textdatei geöffnet wird, könntest du auch die Dateinamenserweiterungen deinem Programm zuordnen.

Das geht nicht, weil das aufrufende Anwendungsprogramm nicht die Datei direkt aufruft, sondern notepad.exe mit der Datei als Parameter.

DeddyH 5. Jan 2008 19:52

Re: Fremden Befehlszeilenaufruf umbiegen?
 
Du könntest aber evtl. die Datei an sich überwachen (ShellNotify oder in der Art).

[edit] Nee, wohl Quatsch, ich glaube, das reine Öffnen löst noch kein Event aus. [/edit]

sirius 5. Jan 2008 19:55

Re: Fremden Befehlszeilenaufruf umbiegen?
 
1. Entweder du patchst das Programm und schreibst etwas anderes als NotePad rein (ist die suche nach der Nadel im Heuhaufen; aber unter Umständen kann man die Nadel einfach rufen und es geht recht fix)
2. Du hookst nur für diesen Process eben einen der Funktionen und biegst den Aufruf um, oder lässt dich einfach Benachrichtigen. Wie gesagt, Code dazu gibts in der uallcollection.

Edit: du kannst evtl. recht einfach patchen, indem du die ImportTable der fremden Exe umbaust und dort eine Funktion deiner DLL einträgst. Und in dieser DLL kannst du dann separieren. Und die DLL muss nur im selben Verzeichnis oder unter system32 liegen.

PeterPanino 5. Jan 2008 20:03

Re: Fremden Befehlszeilenaufruf umbiegen?
 
Vielen Dank für all die hilfreichen Tipps, ich glaube ich werde doch die einfachere Lösung favorisieren und notepad.exe ersetzen, um den tieferen Eingriff ins System mit einem Hook zu vermeiden.

Übrigens, wie war das nochmal mit Konsolenprogrammen, da gab es doch einen Schalter, damit das Konsolenfenster nicht angezeigt wird?

Wotan89 5. Jan 2008 20:03

Re: Fremden Befehlszeilenaufruf umbiegen?
 
Einen Execute-Hook zu schreiben ist eigentlich gar nicht so schwer. Dazu hab ich nicht die Uall-Collection gebraucht. Wenn du weißt wie man einen Hook schreibt geht es relativ schnell. Ich denke es ist besser, wenn man versteht wie dieser funktioniert...
Ich habe eine Link für ApiHooking:http://wiki.hackerboard.de/index.php/Windows_API
Ist zwar in C++, stellt aber kein Problem dar, da die meisten Befehle eh aus der Kernel32.dll stammen. Hab nur kleine Änderungen an der Funktionsweise vorgenommen.

DeddyH 5. Jan 2008 20:05

Re: Fremden Befehlszeilenaufruf umbiegen?
 
Zitat:

Zitat von PeterPanino
Übrigens, wie war das nochmal mit Konsolenprogrammen, da gab es doch einen Schalter, damit das Konsolenfenster nicht angezeigt wird?

Einfach die Zeile {$APPTYPE CONSOLE} löschen ;)

grenzgaenger 5. Jan 2008 21:02

Re: Fremden Befehlszeilenaufruf umbiegen?
 
bist du dir sicher, dass du das willst? oder willst nicht eher, dass wenn jemand mit DClick oder mit der rechten maustaste sagt öffen (ggf. auch über shellexecute), dass dann dein progy die datei öffnet? in diesem fall, brauchst nur dein progy als standard eintragen und schon müsst es laufen.

PeterPanino 5. Jan 2008 21:24

Re: Fremden Befehlszeilenaufruf umbiegen?
 
Zitat:

Zitat von grenzgaenger
bist du dir sicher, dass du das willst? oder willst nicht eher, dass wenn jemand mit DClick oder mit der rechten maustaste sagt öffen (ggf. auch über shellexecute), dass dann dein progy die datei öffnet? in diesem fall, brauchst nur dein progy als standard eintragen und schon müsst es laufen.

Nein (s. oben), für einen workaround. Aber sonst danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:40 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 by Thomas Breitkreuz