デスクトップ等の特殊なフォルダのパスを取得する

Windowsフォルダやテスクトップ等の特殊なフォルダは
色々と参照する事が多いですがOSやユーザーの設定によってパスは違ってきます。
WindowsフォルダならGetWindowsDirectory()
SystemフォルダならGetSystemDirectory()
テンポラリフォルダならGetTempPath()で取得する事ができますが
これら以外、デスクトップやスタートアップ等は専用のAPIがありません。

そこで使用するのがSHGetSpecialFolderLocation()というAPI(シェル)です。
このAPIを使うとデスクトップやスタートアップフォルダだけでなく
色々なフォルダのパスを取得する事が出来ます。
ただし、取得できる物はアイテムIDリストと言う形で取得されるのでそれをパスに変換する必要があります。
アイテムIDリストからパスに変換するにはSHGetPathFromIDList()で行います。
そして最後にアイテムIDリストを取得したら、それを開放しなければならないので
CoTaskMemFree()で開放してください。

例としてデスクトップのパスを取得するソースを示します。


char lpszPath[MAX_PATH] = "";
LPITEMIDLIST pidl;

if(::SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOPDIRECTORY, &pidl) == NOERROR)
{
    ::SHGetPathFromIDList(pidl, lpszPath);
    ::CoTaskMemFree(pidl);
}

AfxMessageBox(lpszPath);

SHGetSpecialFolderLocation()の2番目の引数に
どのフォルダのパスを取得するのか設定しますが
これは各フォルダにパラメータが割り当てられているのでそれを設定します。
以下の表が各フォルダのパラメータです。

パラメータ 番号 フォルダ
CSIDL_DESKTOP 0x0000 デスクトップ
CSIDL_INTERNET 0x0001 インターネット
CSIDL_PROGRAMS 0x0002 プログラム
CSIDL_CONTROLS 0x0003 コントロールパネル
CSIDL_PRINTERS 0x0004 プリンタ
CSIDL_PERSONAL 0x0005 マイ ドキュメント
CSIDL_FAVORITES 0x0006 お気に入り
CSIDL_STARTUP 0x0007 スタートアップ
CSIDL_RECENT 0x0008 最近使ったファイル
CSIDL_SENDTO 0x0009 送る
CSIDL_BITBUCKET 0x000a ゴミ箱
CSIDL_STARTMENU 0x000b スタートメニュー
CSIDL_DESKTOPDIRECTORY 0x0010 デスクトップ
CSIDL_DRIVES 0x0011 マイ コンピュータ
CSIDL_NETWORK 0x0012 マイ ネットワーク
CSIDL_NETHOOD 0x0013 NetHood
CSIDL_FONTS 0x0014 フォント
CSIDL_TEMPLATES 0x0015 テンプレート
CSIDL_COMMON_STARTMENU 0x0016 全ユーザーのスタートメニュー
CSIDL_COMMON_PROGRAMS 0x0017 全ユーザーのプログラム
CSIDL_COMMON_STARTUP 0x0018 全ユーザーのスタートアップ
CSIDL_COMMON_DESKTOPDIRECTORY 0x0019 全ユーザーのデスクトップ
CSIDL_APPDATA 0x001a Application Data
CSIDL_PRINTHOOD 0x001b PrintHood
CSIDL_ALTSTARTUP 0x001d ローカライズされないスタートアップ
CSIDL_COMMON_ALTSTARTUP 0x001e 全ユーザーのローカライズされないスタートアップ
CSIDL_COMMON_FAVORITES 0x001f 全ユーザーのお気に入り
CSIDL_INTERNET_CACHE 0x0020 IEキャッシュ保存先
CSIDL_COOKIES 0x0021 クッキー
CSIDL_HISTORY 0x0022 履歴

黄色の項目は仮想的なフォルダで指定してもパスを取得する事は出来ません。
これはエクスプローラとかで表示されるマイ コンピュータとかの事です。
あと、環境によっては取得できない項目も有るので注意してください。

Windiws2000ではこれ以外にもプログラム標準インストール先(C:Program Files)など取得できます。
適当にパラメータに番号を直接指定してやってどのフォルダが取得できるのか見てみるのも良いでしょう。

Windows95とかでプログラム標準インストール先を取得したい場合はレジストリから直接読みます。
基本的なフォルダの位置は以下のレジストリに書かれています。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
プログラム標準インストール先はここには書いてなくてこちらのキーに書いてあります。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir

おまけでWindows98以降ならばSHGetSpecialFolderPath()
もうちょっと簡単に特殊なフォルダのパスを取得する事ができます。
環境がWindows98以降と決まっているのならばこれを使うのも良いでしょう。

< 戻る << HOME ©1999-2001 by Akky, All right reserved.