[ttssh2-dev 28] 特殊ディレクトリーの取得について

Back to archive index
zmats****@users***** zmats****@users*****
2021年 9月 19日 (日) 23:49:28 JST


松尾です。

r9405で、デスクトップのパスを得るために
SHGetSpecialFolderPathW() を使用していました。
これで良かったっけ?と調べだすと、
いろいろなAPIがあって混乱したので調べました。

デスクトップなどのパスを特殊ディレクトリと呼ぶようです。

今のところ、
戻り値が wchar_t(PWSTR) の SHGetKnownFolderPath() か
戻り値が PIDLIST の SHGetKnownFolderIDList() の
どちらかを使うのがよさそうです。

Tera Term 内では文字列で扱うことがほとんどなので
SHGetKnownFolderPath() になるでしょうか。
ということで、たいていのWindowsで動作する
_SHGetKnownFolderPath() を作って compat_win に追加して
SHGetSpecialFolderLocation() などを置き換えました。



# 特殊ディレクトリを取得するWindowsのAPI一覧

先(上)に出てくるほうが新しいAPIです。

- SHGetKnownFolderPath()
   - 
https://docs.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shgetknownfolderpath
   - 引数
     - KNOWNFOLDERID
   - 戻り値
     - PWSTR
   - Shell32.dll
     - version 6.0.6000 or later
     - Vista 以降

- SHGetKnownFolderIDList()
   - 
https://docs.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shgetknownfolderidlist
   - 引数
     - KNOWNFOLDERID
   - 戻り値
     - PIDLIST
   - Shell32.dll
     - version 6.0.6000 or later
     - Vista 以降

- SHGetFolderPathA()
   - 
https://docs.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shgetfolderpatha
   - 引数
     - CSILD
   - 戻り値
     - LPSTR
     - SHGetFolderPathW() あり
   - Shell32.dll
     - version 5.0 or later
     - Windows 2000, Me
   - 注
     - vista から SHGetKnownFolderPath() へのラッパになった
     - SHGetKnownFolderPath() へ切り替えろと、のこと

- SHGetFolderLocation()
   - 
https://docs.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shgetfolderlocation
   - 引数
     - CSILD
   - 戻り値
     - PIDLIST
   - Shell32.dll
     - version 5.0 or later
     - Windows 2000
   - 注
     - vista から SHGetKnownFolderIDList() へのラッパになった
     - SHGetKnownFolderIDList() へ切り替えろ、とのこと

- SHGetSpecialFolderPathA()
   - 
https://docs.microsoft.com/ja-jp/windows/win32/api/shlobj_core/nf-shlobj_core-shgetspecialfolderpatha
   - 引数
     - CSILD
   - 戻り値
     - LPSTR
     - SHGetSpecialFolderPathW() あり
   - Shell32.dll
     - version 4.71 or later
     - Windows 95 + IE4でok (NT4も?)
     - Windows 98 はokそう
   - 注
     - SHGetFolderPath() を使用しろ、のこと

- SHGetSpecialFolderLocation()
   - 
https://docs.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shgetspecialfolderlocation
   - 引数
     - CSILD
   - 戻り値
     - PIDLIST
   - Shell32.dll
     - version 4.0 or later
     - NT 4.0, 95
     - 将来なくなるから SHGetFolderLocation() 使えとのこと
     - いまのところ Windows 10 の 32,64bitどちらで使用できている

# shell32.dll のバージョン

どのAPIが利用可能かはshell32.dllのバージョンに依存するようです。

https://docs.microsoft.com/ja-jp/windows/win32/shell/versions
の表を元に加筆修正

Version     OS(+IE)
4.0         Windows 95,NT 4.0
4.71        Windows 95,NT 4.0 + Microsoft Internet Explorer 4.0
4.72        Windows 98 / 95,NT 4.0 + Internet Explorer 4.01
5.0         Windows 2000,Me
6.0         Windows XP
6.0.1       Windows Vista
6.1         Windows 7



ttssh2-dev メーリングリストの案内
Back to archive index