Was ist der beste Weg, um herauszufinden, wo notepad.exe und mspaint.exe sind, die für verschiedene Windows-Versionen geeignet sind?
Soll ich das Windows-Verzeichnis über SHGetFolderPath(NULL, CSIDL_WINDOWS, NULL, SHGFP_TYPE_CURRENT, dir)
erhalten und dann alle Unterverzeichnisse durchsuchen, um nach den beiden Dateien zu suchen?
(Angenommen, ich interessiere mich für nichts außerhalb des Windows-Ordners.)
Dies funktioniert auf jeder Windows-Box, auf die ich Zugriff habe (XP +).
c:\> for %i in (cmd.exe) do @echo %~$PATH:i
C:\WINDOWS\system32\cmd.exe
c:\> for %i in (python.exe) do @echo %~$PATH:i
C:\Python25\python.exe
Das Tolle ist, dass Sie nicht haben Um den eigentlichen %PATH%
zu verwenden, können Sie Ihren eigenen Suchpfad durch eine andere Umgebungsvariable ersetzen.
Wenn Sie das Microsoft Platform SDK installiert haben ( die Version vom Februar 2003 ist das letzte, das mit Microsoft VC6 funktioniert), können Sie das where.exe
-Programm (es ist 38 KB, nur 18 KB, wenn Sie es verwenden) ausführen und ausführen
where notepad.exe
hilfe vom Befehl where
:
WHERE [/R dir] [/Q] [/F] [/T] pattern...
Description:
Displays the location of files that match the search pattern.
By default, the search is done along the current directory and
in the paths specified by the PATH environment variable.
Parameter List:
/R Recursively searches and displays the files that match the
given pattern starting from the specified directory.
/Q Returns only the exit code, without displaying the list
of matched files. (quite mode)
/F Displays the matched filename in double quotes.
/T Displays the file size, last modified date and time for all
matched files.
pattern Specifies the search pattern for the files to match.
Wildcards * and ? can be used in the pattern. The
"$env:pattern" and "path:pattern" formats can also be
specified, where "env" is an environment variable and
the search is done in the specified paths of the "env"
environment variable. These formats should not be used
with /R. The search is also done by appending the
extensions of the PATHEXT variable to the pattern.
/? Displays this help message.
NOTE: The tool returns an error level of 0 if the search is
successful, of 1 if the search is unsuccessful and
of 2 for failures or errors.
Examples:
WHERE /?
WHERE myfilename1 myfile????.*
WHERE $windir:*.*
WHERE /R c:\windows *.exe *.dll *.bat
WHERE /Q ??.???
WHERE "c:\windows;c:\windows\system32:*.dll"
WHERE /F /T *.dll
Überprüfen Sie, ob der Schlüssel HKEY_CLASSES_ROOT\Applications\notepad.exe für lokalisierte Versionen gleich ist. Möglicherweise ist der Schlüsselname derselbe und der Wert für Bearbeiten/Öffnen verweist auf das lokalisierte Exe.
Beispiel:
Englisch:
HKEY_CLASSES_ROOT\Applications\notepad.exe\Shell\edit\command
% SystemRoot%\system32 ** NOTEPAD.EXE **% 1
Niederländisch:
HKEY_CLASSES_ROOT\Applications\notepad.exe\Shell\edit\command
% SystemRoot%\system32 ** kladblok.exe **% 1
Wenn dies der Fall ist, wird die Registrierung gerade nach diesem Schlüssel durchsucht (das gleiche gilt für den Befehl mspaint).
Art:
% windir%\system32\notepad.exe in der Pfadleiste
oder
C:\Windows\System32 Und finden Sie notepad.exe
* C ist die Festplatte, auf der sich Ihr Betriebssystem befindet :)
Um klein anzufangen, sollten Sie zunächst die Umgebungsvariable windir
suchen und in den Unterordnern %windir%\system32\
nach mspaint
und notepad
..__ suchen. Am wahrscheinlichsten werden sie dort sein.
Wenn dies jedoch fehlschlägt, greifen Sie zu einer brutaleren Suche zurück.
Normalerweise würden Sie sie einfach ausführen. Sie befinden sich in jeder Windows-Version im Systempfad.
Sie können ExpandEnvironmentStrings
verwenden. Die Umgebungsvariable, die Sie erweitern möchten, ist WINDIR
.
In der Vergangenheit hätten Sie GetWindowsDirectory
oder GetSystemDirectory
verwenden können, aber ich denke, sie sind veraltet.
Da Sie die Frage mit WinAPI markiert haben, würde ich SearchPath () verwenden, z. Im Folgenden wird die Variable path
mit dem Ergebnis aufgefüllt.
//Get the full path to notepad
char path[MAX_PATH] = { 0 };
LPSTR* ptr = NULL;
DWORD dwRet = SearchPath(NULL, "notepad.exe", NULL, MAX_PATH, (LPSTR)path, ptr);
Versuchen Sie, eine DOS-Eingabeaufforderung zu öffnen, wechseln Sie in den Windows-Ordner und führen Sie folgende Schritte aus:
dir notepad.exe /s
Es lebe DOS :)
Zusammenfassend finde ich, dass der beste Ansatz darin besteht, das Windows\System32
-Verzeichnis Und die HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
-Registrierungsschlüssel zu überprüfen.
Allgemeiner finde ich, dass der beste Ansatz ist, ShellExecuteEx
nachzuahmen.
Genommen von:
Anwendungsregistrierung (Windows)
https://msdn.Microsoft.com/de-de/library/windows/desktop/ee872121(v=vs.85).aspx
Die Datei wird an folgenden Speicherorten gesucht:
• Das aktuelle Arbeitsverzeichnis.
• Nur das Windows-Verzeichnis (es werden keine Unterverzeichnisse durchsucht).
• Das Windows\System32-Verzeichnis.
• Verzeichnisse, die in der Umgebungsvariable PATH aufgeführt sind.
• Empfohlen: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
Eine weitere Möglichkeit besteht darin, Start Menu\Programs\Accessories
, Mithilfe von SHGetFolderPath
mit CSIDL_STARTMENU := 11
Und CSIDL_COMMON_STARTMENU := 22
zu überprüfen und die Ziele Aus den lnk-Dateien abzurufen.
Verwenden Sie die WinAPI-Funktion GetWindowsDirectory (), um den Windows-Ordner abzurufen, und GetSystemDirectory (), um den Windows\System-Ordner abzurufen. Sie funktionieren garantiert mit allen Windows-Versionen seit mindestens Win95; Ich denke, sie waren auch in Win 3.x verfügbar.