Quelle est la meilleure façon de savoir où sont notepad.exe et mspaint.exe qui fonctionneront dans différentes versions de Windows?
Dois-je obtenir le répertoire Windows via SHGetFolderPath(NULL, CSIDL_WINDOWS, NULL, SHGFP_TYPE_CURRENT, dir)
, puis parcourir tous les sous-répertoires pour rechercher les deux fichiers?
(Supposons que rien ne m'intéresse en dehors du dossier Windows.)
Cela fonctionne sur toutes les machines Windows auxquelles j'ai accès (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
Le grand avantage est que vous n'avez pas à utiliser le %PATH%
, vous pouvez remplacer votre propre chemin de recherche en utilisant une variable d'environnement différente.
Si Microsoft Platform SDK est installé ( la version de février 2003 est la dernière qui fonctionne avec Microsoft VC6), vous pouvez récupérer le programme where.exe
(38 Ko, seulement 18 Ko si vous le gzipz) et exécuter
where notepad.exe
aide de la commande 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
Vérifiez si la clé HKEY_CLASSES_ROOT\Applications\notepad.exe est identique sur les versions localisées. Peut-être que le nom de la clé est identique et que la valeur pour edit/open pointe vers l'exe localisé.
Exemple:
Anglais:
HKEY_CLASSES_ROOT\Applications\notepad.exe\Shell\edit\command
% SystemRoot%\system32 ** NOTEPAD.EXE **% 1
Néerlandais:
HKEY_CLASSES_ROOT\Applications\notepad.exe\Shell\edit\command
% SystemRoot%\system32 ** kladblok.exe **% 1
Si c'est le cas, il est sur le point de vérifier le registre pour cette clé (la même chose vaut pour mspaint).
Type:
% windir%\system32\notepad.exe dans la barre de chemin
ou
C:\Windows\System32 Et trouvez notepad.exe
* C est le disque dur sur lequel se trouve votre système d'exploitation :)
Je pense que pour commencer petit, vous devriez obtenir la variable d'environnement windir
et regarder dans les sous-dossiers %windir%\system32\
pour mspaint
et notepad
. Ils seront probablement là.
Cependant, si cela échoue, eh bien, faites appel à une recherche plus brutale.
Normalement, vous ne feriez que les exécuter. Ils sont sur le chemin du système dans chaque version de Windows.
Vous pouvez utiliser ExpandEnvironmentStrings
. La variable d'environnement que vous souhaitez développer est WINDIR
.
Dans le passé, vous auriez pu utiliser GetWindowsDirectory
ou GetSystemDirectory
, mais je pense qu'ils sont obsolètes.
Puisque vous avez balisé la question avec WinAPI, je voudrais utiliser SearchPath () p. Ex. Ce qui suit va peupler la variable path
avec le résultat.
//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);
Ouvrez une invite DOS, ouvrez le dossier Windows et procédez comme suit:
dir notepad.exe /s
Longue vie au DOS :)
En bref, je trouve que la meilleure approcheest de vérifier le répertoire Windows\System32
.__ et la clé de registre HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
.
Plus généralement, j'estime que la meilleure approche est de mimer ShellExecuteEx
.
Pris à partir de:
Enregistrement d'application (Windows)
https://msdn.Microsoft.com/en-us/library/windows/desktop/ee872121(v=vs.85).aspx
Le fichier est recherché aux endroits suivants:
• Le répertoire de travail actuel.
• Le répertoire Windows uniquement (aucun sous-répertoire n’est recherché).
? Le répertoire Windows\System32.
• Répertoires répertoriés dans la variable d’environnement PATH.
• Recommandé: chemins d'accès HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App
Une autre possibilité consiste à vérifier Start Menu\Programs\Accessories
, .__ en utilisant SHGetFolderPath
avec CSIDL_STARTMENU := 11
Et CSIDL_COMMON_STARTMENU := 22
et à extraire les cibles Des fichiers lk.
Utilisez la fonction WinAPI GetWindowsDirectory () pour obtenir le dossier Windows et GetSystemDirectory () pour obtenir le dossier Windows\System. Ils sont assurés de fonctionner avec toutes les versions de Windows depuis au moins Win95; Je pense qu'ils étaient également disponibles dans Win 3.x.