「特殊フォルダのパスを取得する」
特殊フォルダのパスを取得するにはどうしたらいいでしょうか。
また、WindowsXPとWindows7ではどのように違うのでしょうか。
回答
SHGetSpecialFolderPathを使えば取得できます。
function SHGetSpecialFolderPath(
whndOwner:HWND; lpszPath:PWideChar;
nFolder:integer; fCreate:LongBool
):LongBool;
戻り値:成功したらTRUE、失敗でFALSE
whndOwner:オーナーのウィンドウハンドル
lpszPath:取得するパスが入る変数
fCreate:TRUEだとフォルダが存在しない場合に作成
nFolder:取得したい特殊フォルダのCSIDLで始まる以下のいずれかの値
CSIDL_DESKTOP
XPの場合 C:\Documents and Settings\<User Name>\デスクトップ
7の場合 C:\Users\<User Name>\Desktop
CSIDL_FAVORITES
XPの場合 C:\Documents and Settings\<User Name>\Favorites
7の場合 C:\Users\<User Name>\Favorites
CSIDL_FONTS
XPの場合 C:\WINDOWS\Fonts
7の場合 C:\Windows\Fonts
CSIDL_PERSONAL
XPの場合 C:\Documents and Settings\<User Name>\My Documents
7の場合 C:\Users\<User Name>\Documents
CSIDL_PROGRAM_FILES
XPの場合 C:\Program Files
7の場合 C:\Program Files
CSIDL_PROGRAMS
XPの場合 C:\Documents and Settings\<User Name>\スタート メニュー\プログラム
7の場合 C:\Users\<User Name>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
CSIDL_STARTUP
XPの場合 C:\Documents and Settings\<User Name>\スタート メニュー\プログラム\スタートアップ
7の場合 C:\Users\<User Name>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
CSIDL_WINDOWS
XPの場合 C:\WINDOWS
7の場合 C:\Windows
CSIDL_SENDTO
XPの場合 C:\Documents and Settings\<User Name>\SendTo
7の場合 C:\Users\<User Name>\AppData\Roaming\Microsoft\Windows\SendTo
CSIDL_APPDATA
XPの場合 C:\Documents and Settings\<User Name>\Application Data
7の場合 C:\Users\<User Name>\AppData\Roaming
CSIDL_TEMPLATES
XPの場合 C:\Documents and Settings\<User Name>\Templates
7の場合 C:\Users\<User Name>\AppData\Roaming\Microsoft\Windows\Templates
CSIDL_COMMON_STARTMENU
XPの場合 C:\Documents and Settings\All Users\スタート メニュー
7の場合 C:\ProgramData\Microsoft\Windows\Start Menu
CSIDL_COMMON_PROGRAMS
XPの場合 C:\Documents and Settings\All Users\スタート メニュー\プログラム
7の場合 C:\ProgramData\Microsoft\Windows\Start Menu\Programs
CSIDL_COMMON_STARTUP
XPの場合 C:\Documents and Settings\All Users\スタート メニュー\プログラム\スタートアップ
7の場合 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
CSIDL_COMMON_DESKTOPDIRECTORY
XPの場合 C:\Documents and Settings\All Users\デスクトップ
7の場合 C:\Users\Public\Desktop
CSIDL_COMMON_APPDATA
XPの場合 C:\Documents and Settings\All Users\Application Data
7の場合 C:\ProgramData
CSIDL_COMMON_DOCUMENTS
XPの場合 C:\Documents and Settings\All Users\Documents
7の場合 C:\Users\Public\Documents
CSIDL_COMMON_PICTURES
XPの場合 C:\Documents and Settings\All Users\Documents\My Pictures
7の場合 C:\Users\Public\Pictures
CSIDL_COMMON_FAVORITES
XPの場合 C:\Documents and Settings\All Users\Favorites
7の場合 C:\Users\<User Name>\Favorites
CSIDL_COMMON_ADMINTOOLS
XPの場合 C:\Documents and Settings\All Users\スタート メニュー\プログラム\管理ツール
7の場合 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools
CSIDL_ADMINTOOLS
XPの場合 C:\Documents and Settings\<user name>\スタート メニュー\プログラム\管理ツール
7の場合 C:\Users\<User Name>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Administrative Tools
CSIDL_LOCAL_APPDATA
XPの場合 C:\Documents and Settings\<User Name>\Local Settings\Application Data
7の場合 C:\Users\<User Name>\AppData\Local
CSIDL_SYSTEM
XPの場合 C:\WINDOWS\system32
7の場合 C:\Windows\system32
CSIDL_PROGRAM_FILES_COMMON
XPの場合 C:\Program Files\Common Files
7の場合 C:\Program Files\Common Files
CSIDL_PROFILE
XPの場合 C:\Documents and Settings\<User Name>
7の場合 C:\Users\<User Name>
ソース
(例)Delphi2009以降でデスクトップフォルダのパスを取得
Uses句にWinapi.ShlObjを追加します。
var pw:PWideChar;
st:string;
begin
getmem(pw,2048);
try
ZeroMemory(pw,2048);
SHGetSpecialFolderPath(handle,pw,CSIDL_DESKTOP,false);
st:=pw;
finally
freemem(pw);
end;
showmessage(st);
end;