![]() |
Windows API Funktion um Befehlsziel zu ermitteln?
Guten Abend,
ich entwickel zur Zeit eine neue Version meiner Software "AutostartAdministrator" zur Verwaltung von Windows Autostarts. Info: ![]() Hierbei ist wichtig Befehle die in Autostart-Einträgen vermerkt sind zu interpretieren und deren Ziel zu ermitteln. Beispiele:
Code:
Bislang hab ich eine eigene Funktion hierfür, diese geht den vorliegenden String Zeichen für Zeichen durch, solange bis der Pfad existiert. Dies ist sehr Rechenintensiv und führt nicht immer zum Ziel.
Befehl: Explorer.exe
Ziel: C:\Windows\Explorer.exe Parameter= Befehl=%windir%\system32\regedit.exe /s c:\test.reg Ziel: C:\Windows\System32\regedit.exe Parameter: /s c:\test.reg Deshalb wollt ich wissen ob die Windows API hier etwas zur Verfügung stellt, schließlich muss auch Windows (Beispiel: Start->Ausführen) solche Befehle interpretieren. Vielen Dank schon mal im Voraus. |
Re: Windows API Funktion um Befehlsziel zu ermitteln?
gehst du jedes zeischen durch und probierst ob die Datei/Ordner existiert oder gehst du bis zum ersten leerzeischen?
|
Re: Windows API Funktion um Befehlsziel zu ermitteln?
Delphi-Quellcode:
Also alles Weichenweise... Über den Leerstring lässt sich das nicht bei allem Befehlen machen:
// Wurde von mir wieder entfernt...
c:\Dokumente und Einstellungen\Datei.txt "c:\Dokumente und Einstellungen\Datei.txt" usw... Gibt einfach zu viele Schreibweisen hierfür. |
Re: Windows API Funktion um Befehlsziel zu ermitteln?
Dann kanns ja noch passieren das der Nutzer keine Dateiendung angibt, somit müssen diese auch noch geprüft werden.
|
Re: Windows API Funktion um Befehlsziel zu ermitteln?
ich würde empfehlen bis zum ersten leerzeischen bzw. bis zum ende zu suchen. Denn sonst kannst du durch aus die falsche datei finden.
hast du zum beispiel den String: e:\benutername\liste.txt würdest du die Datei e:\benuter finden. Anstelle nach jedem Buchstaben zu prüfen ob die Datei bis dahin existiert würde ich also empfehlen nach jedem leerzeichen zu prüfen. [Edit] Wenn die gefundene Datei keine Ausführbare Datei ist kannst du dann eigentlich davon ausgehen das die Zeischen die dahinter folgen keine Parameter sind sondern zum Dateinamen gehören. [/Edit] |
Re: Windows API Funktion um Befehlsziel zu ermitteln?
Dennoch wird das ganze zu lange dauern, so wie es jetzt ist läuft es ja, identifiziert nur bestimmte einträge nicht:
%systemroot%\system32\dumprep 0 -k Keine Ahnung warum. Ich will deshalb gerne eine Windows Funktion nutzen... Die müsste es doch geben, nach welchen Schlagworten könnt man da suchen? |
Re: Windows API Funktion um Befehlsziel zu ermitteln?
Die shlwapi.dll hat eine Menge Funktionen, die in diesem Zusammenhang nützlich sein könnten:
z.B.: ![]() ![]() ![]() Einfach mal die Liste da browsen :) Und
Delphi-Quellcode:
nicht vergessen ;)
uses shlwapi;
|
Re: Windows API Funktion um Befehlsziel zu ermitteln?
Einen rießen Dank schonmal für die DLL!
Aber wenn ich im Uses Bereich "shlwapi" eintrage heißt es: Fehler: Datei nicght gefunden "shlwapi.dcu"... Gibts die Unit nicht standardgenäß in Delphi und wenn dem so ist woher bekomm ich die DLL Header her, so das ich die Funktion implementieren kann? |
Re: Windows API Funktion um Befehlsziel zu ermitteln?
Hm also bei Delphi 2006 ist die shlwapi.pas/dcu schon dabei. Du kannst sie dir aber auch von
![]() |
Re: Windows API Funktion um Befehlsziel zu ermitteln?
So ich kann also nun die Funktionen ansteuern, danke schon mal.
Leider tut keiner der obengenannten Funktion das was ich erwarte. Auch die anderen auf der MSDN Seite mit Path* Prefix tun nichts dergleichen. Die einzige Fúnktion die hier nützlich war ist PathGetArgs() bzw. PathRemoveArgs(). Auch eine weitere recherche über Google ergab nichts wirklich brauchbares... Hat noch jemand eine Idee? |
Re: Windows API Funktion um Befehlsziel zu ermitteln?
Ich hab nun eine selbst geschriebene Lösung. Das Ergebnis könnt ihr unter der folgenden Adresse bewundern:
![]() |
Re: Windows API Funktion um Befehlsziel zu ermitteln?
folgendes würde ich abwandeln von:
Delphi-Quellcode:
nach
// Prüft ob ein Verzeichnis ODER eine Datei existiert
function FileOrDirExists(Filename:TFilename):Boolean; begin Result:=(DirectoryExists(Filename) or Fileexists(Filename)); end;
Delphi-Quellcode:
Grund: FileExists und DirectoryExists machen nichts anderes + das Prüfen ob es ein Verzeichnis oder eine Datei ist. Du rufst sozusagen 2 mal das gleiche auf.
function FileOrDirExists(Filename:TFilename):Boolean;
var lSearchRec: TSearchRec; begin if FindFirst(AFilename, faAnyFile, lSearchRec) = 0 then begin FindClose(lSearchRec); result := True; end else result := False; end; |
Re: Windows API Funktion um Befehlsziel zu ermitteln?
Bist du dir sicher das genau das hinter FileExists/DirectoryExists steckt bzw. könnte etwas unerwartetes auftauchen oder etwas nicht mehr kompatibel sein, wenn ich deinen Code einsetze?
|
Re: Windows API Funktion um Befehlsziel zu ermitteln?
DirectoryExists macht intern ein: GetFileAttributes
und FileExists macht intern ein: FileAge welches wiederum ein FindFirstFile macht. Letztendlich kannst du dich als für eine der beiden Varianten entscheiden. Also ob du Generell mit GetFileAttributes oder mit FindFirstFile arbeiten willst. GetFileAttributes gibt dir im Fehlerfall DWORD(-1) zurück. Du kannst eigentlich auch auf folgende Weise überprüfen ob eine Datei oder ein Verzeichnis existiert:
Delphi-Quellcode:
oder du prüfst eben mit FindFirstFile ob ein bestimmter Verzeichniseintrag vorhanden (wobei du das FindFirstFile-Handle mit FindClose wieder schließen musst)
result := GetFileAttributes(PChar(AFileName)) <> DWORD(-1);
|
DP-Maintenance
Dieses Thema wurde von "Daniel" von "Windows 9x / ME / 2000 / XP / 2003" nach "Windows API / MS.NET Framework API" verschoben.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:03 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