Notepad.exeとmspaint.exeがWindowsのさまざまなバージョンで機能する場所を見つける最良の方法は何ですか?
SHGetFolderPath(NULL, CSIDL_WINDOWS, NULL, SHGFP_TYPE_CURRENT, dir)
でWindowsディレクトリを取得し、すべてのサブディレクトリを走査して2つのファイルを探す必要がありますか?
(Windowsフォルダー以外のものには興味がないと仮定します。)
これは、(XP +)にアクセスできるすべてのWindowsボックスで機能します。
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
すばらしいのは、実際の%PATH%
を使用するためにhaveを使用しないことです。別の環境変数を使用して独自の検索パスに置き換えることができます。
Microsoft Platform SDKがインストールされている場合( 2003年2月バージョン はMicrosoft VC6で動作する最後のものです)、where.exe
プログラム(38Kで、gzipで圧縮した場合は18Kのみ)および実行
where notepad.exe
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
キーHKEY_CLASSES_ROOT\Applications\notepad.exeがローカライズバージョンと同じかどうかを確認します。キー名が同じで、編集/オープンの値がローカライズされたexeを指している可能性があります。
例:
英語:
HKEY_CLASSES_ROOT\Applications\notepad.exe\Shell\edit\command
%SystemRoot%\ system32 ** NOTEPAD.EXE **%1
オランダの:
HKEY_CLASSES_ROOT\Applications\notepad.exe\Shell\edit\command
%SystemRoot%\ system32 ** kladblok.exe **%1
その場合は、そのキーのレジストリをチェックしようとしています(mspaintでも同様です)。
タイプ:
パスバーThinggyの%windir%\ system32\notepad.exe
または
C:\ Windows\System32およびnotepad.exeを見つける
* Cは、OSが配置されているハードドライブです。
小さなことから始めて、windir
環境変数を取得し、サブフォルダー%windir%\system32\
for mspaint
およびnotepad
。おそらく彼らはそこにいるでしょう。
ただし、それが失敗した場合は、より強引な検索に頼ってください。
通常、それらを実行するだけです。これらは、Windowsのすべてのバージョンのシステムパス上にあります。
ExpandEnvironmentStrings
を使用できます。展開する環境変数はWINDIR
です。
過去にはGetWindowsDirectory
またはGetSystemDirectory
を使用できましたが、これらは非推奨だと思います。
質問にWinAPIでタグ付けしたので、 SearchPath() を使用します。以下は、変数path
に結果を取り込みます。
//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);
DOSプロンプトを開いて、Windowsフォルダーに移動して、以下を実行してください。
dir notepad.exe /s
ロングライブDOS :)
手短に言えば、Windows\System32
ディレクトリとHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
レジストリキーを確認するのが最善の方法であることがわかりました。
より一般的には、ShellExecuteEx
を模倣するのが最良のアプローチであることがわかります。
から取得:
アプリケーション登録(Windows)
https://msdn.Microsoft.com/en-us/library/windows/desktop/ee872121(v = vs.85).aspx
ファイルは次の場所で検索されます。
•現在の作業ディレクトリ。
•Windowsディレクトリのみ(サブディレクトリは検索されません)。
•Windows\System32ディレクトリ。
•PATH環境変数にリストされているディレクトリ。
•推奨:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
さらに、Start Menu\Programs\Accessories
およびCSIDL_STARTMENU := 11
でSHGetFolderPath
を使用してCSIDL_COMMON_STARTMENU := 22
を確認し、lnkファイルからターゲットを取得することもできます。
WinAPI関数GetWindowsDirectory()を使用してWindowsフォルダーを取得し、GetSystemDirectory()を使用してWindows\Systemフォルダーを取得します。少なくともWin95以降、すべてのWindowsバージョンで動作することが保証されています。 Win 3.xでも同様に利用できたと思います。