2009-02-06 16 views
26

Qual è il modo migliore per scoprire dove notepad.exe e mspaint.exe funzioneranno su varie versioni di Windows?Trova il percorso di notepad.exe e mspaint.exe

Devo ottenere la directory di Windows tramite SHGetFolderPath(NULL, CSIDL_WINDOWS, NULL, SHGFP_TYPE_CURRENT, dir) e quindi attraversare tutte le sottodirectory per cercare i due file?

(dal presupposto che io non sono interessato a nulla al di fuori della cartella di Windows.)

+0

Qualunque soluzione decidiate, preparatevi a * non * trovarli affatto. Ho eliminato uno o entrambi su alcuni sistemi (perché dovrei tenere il blocco note.exe around quando ho notepad ++) –

+9

@Stephen: Qual è il punto in cui si eliminano piccole cose così leggere che non rilasceranno realmente alcuna risorsa ma introdurranno solo il rischio di rompere alcuni programmi? – chiccodoro

risposta

0

provare ad aprire un prompt di DOS, passare alla cartella di Windows e fare:

dir notepad.exe /s 

Viva DOS :)

+0

tecnicamente corretto, ma forza bruta e funziona solo per le cose all'interno della cartella di Windows –

41

Funziona su tutte le finestre di Windows a cui ho accesso (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 

La cosa bella è, non lo fai hanno di utilizzare l'attuale %PATH%, è possibile sostituire il proprio percorso di ricerca usando una variabile di ambiente diverso.

+0

Non lo farebbe su molte versioni localizzate di Windows poiché l'eseguibile potrebbe essere chiamato diversamente. – peSHIr

+0

Quindi si sostituisce il nome localizzato. Questo sarà un problema con qualsiasi soluzione a meno che non si pensi che ci sia una costante WIN_NOTEPAD_REALNAME da qualche parte nell'API Win32. – paxdiablo

+5

notepad.exe è ancora notepad.exe e cmd.exe è ancora cmd.exe in tutte le versioni linguistiche di Windows (98, XP, Vista) che ho visto (circa 20). Le cartelle possono essere denominate in modo diverso, ma i file eseguibili, le librerie e altri elementi importanti non vengono tradotti, almeno non i nomi dei file. – Piskvor

2

penso di iniziare piccolo si dovrebbe ottenere la variabile d'ambiente windir e guardare nelle sottocartelle %windir%\system32\ per mspaint e notepad. Molto probabilmente saranno lì.

Tuttavia, se ciò non riesce, ricorrere a una ricerca di forza più bruta.

2

Normalmente, li eseguireste semplicemente. Sono sul percorso di sistema in ogni versione di Windows.

È possibile utilizzare ExpandEnvironmentStrings. La variabile di ambiente che desideri espandere è WINDIR.

In passato si poteva usare GetWindowsDirectory o GetSystemDirectory, ma penso che siano deprecati.

3

Verificare se la chiave HKEY_CLASSES_ROOT \ Applications \ notepad.exe è la stessa su versioni localizzate. Forse il nome della chiave è lo stesso e il valore per modificare/aprire i punti per l'exe localizzato.
Esempio:

inglese:
HKEY_CLASSES_ROOT \ Applications \ notepad.exe \ shell \ Modifica \ comando
% SystemRoot% \ system32 ** ** NOTEPAD.EXE% 1

olandese:
HKEY_CLASSES_ROOT \ Applicazioni \ notepad.exe \ shell \ Modifica \ command
% SystemRoot% \ system32 ** ** kladblok.exe% 1

Se questo è il caso, allora il suo solo di controllare il registro per quella chiave (stessa va per il mspain t).

+0

Sembra un modo valido per farlo, sì. A condizione che l'assunzione sia valida. (Non riesco a controllarmi, dato che non sono su un Windows localizzato non in inglese e non ho i permessi di modifica del registro qui ...) – peSHIr

+0

Chiunque abbia la possibilità di controllare? – Stefan

+0

almeno nella versione tedesca la chiave è la stessa, tuttavia notepad.exe è ancora chiamato notepad.exe – Alex

18

Se avete il Platform SDK Microsoft installato (the February 2003 version è l'ultima che funziona con Microsoft VC6), si può afferrare il programma where.exe (è 38K solo 18 carati, se si gzip) e eseguire

where notepad.exe 

aiuto dal comando 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 
+1

"where" disponibile in Windows 7 per impostazione predefinita e forse in Vista – KindDragon

0

utilizzare la funzione WinAPI GetWindowsDirectory() per ottenere la cartella Windows e GetSystemDirectory() per ottenere la cartella Windows \ System. Sono garantiti per funzionare con tutte le versioni di Windows almeno da Win95; Penso che fossero disponibili anche in Win 3.x.

1

Dato che hai taggato la domanda con WinAPI, userei SearchPath() ad es. Quanto segue popolerà la variabile path con il risultato.

//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); 
3

Tipo:

% windir% \ system32 \ notepad.exe nella barra percorso thinggy

o

C: \ Windows \ System32 e trovare notepad.exe

* C è il disco rigido in cui si trova il sistema operativo :)

-1

Passare alla cartella system32 e digitare "notepad.exe" nella barra "Nome file".

0

Insomma trovo che l'approccio migliore è quello di verificare la Windows\System32 directory e le chiavi di registro HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths.

Più in generale trovo che l'approccio migliore sia quello di imitare ShellExecuteEx.

Tratto da:
Registrazione Application (Windows)
https://msdn.microsoft.com/en-us/library/windows/desktop/ee872121(v=vs.85).aspx

Il file viene cercato nelle seguenti posizioni:
• La directory di lavoro corrente.
• Solo la directory di Windows (non vengono ricercate sottodirectory).
• La directory Windows \ System32.
• Directory elencate nella variabile di ambiente PATH.
• Consigliato: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ App Paths

Un'ulteriore forse è quello di verificare Start Menu\Programs\Accessories, utilizzando SHGetFolderPath con CSIDL_STARTMENU := 11 e CSIDL_COMMON_STARTMENU := 22, e recuperare gli obiettivi dai file LNK .