XP の場合、Windows はSHGetFolderPath()を提供して、既知の場所を取得します。探している CSIDL はCSIDL_COMMON_APPDATA
、次のように記述されています。
すべてのユーザーのアプリケーション データを含むファイル システム ディレクトリ。典型的なパスは"C:\Documents and Settings\All Users\Application Data"
. このフォルダーは、ユーザー固有ではないアプリケーション データに使用されます。たとえば、アプリケーションは、スペル チェック辞書、クリップ アートのデータベース、またはログ ファイルをCSIDL_COMMON_APPDATA
フォルダーに格納できます。この情報はローミングされず、コンピュータを使用しているすべてのユーザーが利用できます。
Vista 以降では、これは SHGetKnownFolderPath() に置き換えられましたが、 SHGetFolderPath() はそのラッパー関数として引き続き使用できます。実際の Vista 呼び出しを使用する場合は、FOLDERID_ProgramData
代わりに を使用する必要がありCSIDL_COMMON_APPDATA
ます。
このリンクは、ここでそれを行う方法を示しているようです。
要約すると、次のようになります (これは慎重に扱ってください。Delphi についてはよくわかりません)。
function ShGetKnownFolderPath (
const rfid: TGUID;
dwFlags: DWord;
hToken: THandle;
out ppszPath: PWideChar): HResult;
var
Shell: HModule;
Fn: TShGetKnownFolderPath;
begin
Shell := LoadLibrary ('shell32.dll');
Win32Check(Shell <> 0);
try
@Fn := GetProcAddress (Shell, 'SHGetKnownFolderPath');
Win32Check (Assigned (Fn));
Result := Fn (rfid, dwFlags, hToken, ppszPath);
finally
FreeLibrary (Shell);
end;
end;
function GetKnownFolderPath (
const rfid: TGUID;
dwFlags: DWord;
hToken: THandle): WideString;
var
buffer: PWideChar;
ret: HResult;
begin
ret :=ShGetKnownFolderPath (rfid, dwFlags, hToken, buffer);
OleCheck (ret);
try
Result := buffer;
finally
CoTaskMemFree (buffer);
end;
end;
このページCSIDL_*
には、すべてのとの値のリストが表示されFOLDERID_*
ます。のようなハードコードされた値ではなく、ユーザー固有のデータにもこれらの関数を使用する必要があることに注意してください"C:\Documents and Settings\<CurrentUser>\Application Data\"
。Windows の異なる言語バージョンでは異なるディレクトリ名が使用されているか、ユーザーがデータ領域を自由に移動できる可能性があります。