5

私のアプリケーションは現在、現在のユーザーのプロファイル ( C:\Documents and Settings\<CurrentUser>\Application Data\MyApplication\MySettings.iniWinXP の下) の下の INI ファイルに設定を保存しています。しかし、これらの設定の一部はユーザーではなくマシンに固有のものであるため、すべてのユーザーに対して単一の場所に保存する必要がある (実際には必要) ことに気付きました。

ユーザーに依存しない設定を保存できる Windows XP (およびそれ以降) のフォルダーの場所はありますか?

注:アプリケーションと同じフォルダに保存したくありませんし、レジストリにも保存したくありません。

「C:\Documents and Settings\」の下に「All Users」フォルダがあることに気付きましたか? その下に保管する必要がありますか?

ボーナス ポイント: Delphi 7 で Windows からこのパスを返す方法を教えてくれる人に答えを与える可能性が高くなります。

4

2 に答える 2

12

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 の異なる言語バージョンでは異なるディレクトリ名が使用されているか、ユーザーがデータ領域を自由に移動できる可能性があります。

于 2009-08-11T02:12:01.563 に答える
6

このような場合は、オープン ソースのJEDI Code Libraryを使用することをお勧めします。

JclShell.pas には GetSpecialFolderLocation() があります。

YourDataFolder := GetSpecialFolderLocation(CSIDL_COMMON_APPDATA);

これは無料で、十分にテストされており、すべての Windows バージョンで動作し、それを使用すると、Windows API に対する将来の変更から保護されます。

于 2009-08-31T21:32:18.043 に答える