Mam's WebSite

Mamの覚書Q&A検索


大項目:「 Delphi 」 - 中項目:「 API 」

「 特殊フォルダのパスを取得する 」

特殊フォルダのパスを取得するにはどうしたらいいでしょうか。
また、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;

Copyright 2019 Mam