2

大規模な大学のユーザーの 1 人 (おそらく、大学の IT 部門がコンピュータに積極的なセキュリティ設定を行っていると思います) の 1 人が、Windows XP から CSIDL_COMMON_APPDATA または CSIDL_PERSONAL に対して空の文字列が返されます。(彼のコンピューターを調べてソフトウェアのインストール方法を確認していないため、これらのどれが空の文字列を返しているのかわかりませんが、COMMON_APPDATA であると確信しています...)

誰かがこれに遭遇したか、これに対処する方法について提案がありますか?

値を取得するために使用している Delphi コードは次のとおりです。

Function GetSpecialFolder( FolderID: Integer):String;
var
  PIDL: PItemIDList;
  Path: array[0..MAX_PATH] of Char;
begin
  SHGetSpecialFolderLocation(Application.Handle, FolderID, PIDL);
  SHGetPathFromIDList(PIDL, Path);
  Result := Path;
end;  { GetSpecialFolder }

ShowMessage(GetSpecialFolder(CSIDL_COMMON_APPDATA));  <--- This is an empty string

編集:

この API を理解することで、自分のしっぽを追いかけているような気分になりました。この方法とそれに類似した他の方法は、マイクロソフトによって非推奨にされていると言われています (同様に、この質問に対する以前の投稿者 (@TLama?) も、後で投稿を削除しました)。そのステータスを安全に無視します。

私の検索では、これを行う推奨の方法のサンプルコードを含む、 SO に関する良い答えが見つかりました。

4

1 に答える 1

7

API 呼び出しが失敗する理由を知りたい場合は、戻り値を確認する必要があります。それがこのコードに欠けているものです。

各機能を独自のメリットで扱う必要があります。MSDN のドキュメントを参照してください。の場合SHGetSpecialFolderLocation、戻り値はHRESULT. SHGetPathFromIDListあなたが戻ってくるからBOOLです。その場合FALSE、呼び出しは失敗しました。

ここで考えられる原因はSHGetSpecialFolderLocation、CSIDL を受け取るコードですが、Windows API 関数を呼び出すたびにエラーをチェックする必要があります。

ドキュメントCSIDLを見ると、次のことがわかります。

CSIDL_COMMON_APPDATA

バージョン 5.0。すべてのユーザーのアプリケーション データを含むファイル システム ディレクトリ。一般的なパスは、C:\Documents and Settings\All Users\Application Data です。このフォルダーは、ユーザー固有ではないアプリケーション データに使用されます。たとえば、アプリケーションは、スペル チェック辞書、クリップ アートのデータベース、またはログ ファイルを CSIDL_COMMON_APPDATA フォルダーに格納できます。この情報はローミングされず、コンピュータを使用しているすべてのユーザーが利用できます。

マシンのシェル バージョンが 5.0 より前の場合、このCSIDL値はサポートされません。これは、このCSIDL値の唯一の文書化された障害モードです。あなたの状況には当てはまらないと思いますので、HRESULTステータスコードが何を言っているかを確認する必要があります。

于 2013-01-26T18:15:32.350 に答える