12

GUID が関連付けられている仮想フォルダーがいくつかあるようです (コントロール パネル、デスクトップ) -

::{00021400-0000-0000-c000-000000000046} // デスクトップ

これらのブレーズはどこで定義されていますか? それらはいつ使用されますか?

私が欲しいのは、あいまいさのない仮想フォルダーを表す文字列を持つ方法です。

たとえば、デスクトップ用の PIDL を作成すると、表示名は "C:\Users\Steve\Desktop" として返されます。

現時点ではそうですが、実際には正しいフォルダではありません。エクスプローラーでそのフォルダーに移動できます。デスクトップ全体ではなく、デスクトップ上のファイルの一部が含まれています。

私が欲しいのは、その場所を常に仮想デスクトップフォルダー (いくつかのものだけでなく、すべてのコンテンツを含むフォルダー) に移動する文字列としてエンコードする方法です。

そのようなGUIDの決定的なリストを知っている人はいますか? または、特定の PIDL を PIDL に変換するにはどうすればよいですか?

SHGetDisplayName(pidl, SHGDN_*) を試しました - デスクトップ pidl のすべてのバージョンで、短い「デスクトップ」または「C:\Users\Steve\Desktop」のいずれかが返されます。(もちろん、'steve' アカウントでログインしています)。

アイデア/コメント/ポインタ?

編集:したがって、以下の回答を使用して、既知のフォルダー GUId のリストを取得できるようです。しかし、PIDL -> 既知のフォルダー GUID からプログラムで変換する方法を知っている人はいますか? ParseDisplayName("::{guid}") で PIDL を取得できると思いますが、GUID を取得する方法はありますか?

EDIT2: プログラムで GUID にアクセスする方法がまだ見つかりません。ただし、私の目的のために、最初にオブジェクトを作成するために使用する CSIDL_xxx を記録し、それを書き出して後で復元し、CSIDL を介して PIDL を作成します。これにより、正しい ID が保持されます (つまり、 「C:\Users\\Desktop」に劣化するのではなく、実際に仮想デスクトップを指す PIDL を生成します。

私にとっての秘訣は、常に CSIDL->PIDL を使用し、その間に文字列を使用しないことです。CSIDL->PIDL->string->PIDL = 非仮想パスへの縮退。

助けてくれてありがとう - そして、誰かがこの件についてもっと見つけて投稿してくれるかどうかを探し続けます。私は興味があります! ;)

4

2 に答える 2

5

あなたが正しく理解している場合は、CSIDL s (pre-Vista、Shlobj.h を含む) またはKNOWNFOLDERID (>= Vista、Knownfolders.h) を探しています。

于 2010-01-21T19:37:36.273 に答える
1

これらのGUIDが正式に文書化されているとは思いません。SHGetPathFromIDList()を使用してGUIDを取得できます。失敗を示しますが、pszPathパラメーターを見ると、GUIDが入力されていることがわかります(ただし、最初の文字はNULLに設定されています)。それとは別に、他の人が発見したGUIDSのさまざまなリストを見つけることができます。

編集:私はいくつかの興味深いリンクを見つけました。レジストリを検索することで、これらのGUIDを見つけることができるようです。

シェルGUIDに関するフォーラム投稿

コントロールパネルのGUID

シェル名前空間のインストール方法

于 2010-01-21T19:56:24.610 に答える