2010-01-21 10 views
12

Dường như có một vài thư mục ảo có GUIDs liên quan đến họ (bảng điều khiển, máy tính để bàn) -Tất cả các GUID thư mục ảo nổi tiếng là gì?

:: {00021400-0000-0000-c000-000000000046} // desktop

đâu ngọn lửa được xác định? Khi nào chúng được sử dụng?

Điều tôi muốn là một cách để có chuỗi đại diện cho thư mục ảo mà không có bất kỳ sự mơ hồ nào.

Nếu, ví dụ, tôi đã tạo một PIDL cho máy tính để bàn, tên hiển thị trở lại là "C: \ Users \ Steve \ Desktop".

Vâng, đó là sự thật vào lúc này - nhưng không thực sự là thư mục chính xác. Tôi có thể điều hướng trong Explorer tới thư mục đó và nó chứa một phần của các tệp trên màn hình của tôi, chứ không phải toàn bộ màn hình.

Điều tôi muốn là cách mã hóa vị trí đó dưới dạng chuỗi sẽ luôn điều hướng đến thư mục máy tính để bàn ảo (thư có tất cả nội dung của nó, không chỉ một vài thứ).

Có ai biết danh sách cuối cùng về GUID như vậy không? Hoặc làm thế nào tôi có thể chuyển đổi một PIDL nhất định thành một?

Tôi đã thử SHGetDisplayName (pidl, SHGDN_ *) - mọi phiên bản cho pidl trên máy tính để bàn đều cho tôi một "Màn hình nền" ngắn hoặc "C: \ Users \ Steve \ Desktop". (Tôi đã đăng nhập dưới tài khoản 'steve', rõ ràng).

Ý tưởng/nhận xét/con trỏ?

EDIT: Vì vậy, có vẻ như tôi có thể sử dụng các câu trả lời đã cho dưới đây để có danh sách các GUI được biết đến của thư mục. Nhưng có ai biết lập trình làm thế nào để chuyển đổi từ một PIDL -> GUID thư mục được biết đến? Tôi giả sử rằng tôi có thể ParseDisplayName (":: {guid}") để có được PIDL, nhưng có cách nào để có được GUID?

EDIT2: Tôi vẫn không thể tìm thấy cách để truy cập GUID theo chương trình. Tuy nhiên, với mục đích của mình, tôi đang ghi CSIDL_xxx mà tôi sử dụng để tạo đối tượng ban đầu và viết ra & khôi phục lại sau, rồi tạo PIDL bằng CSIDL, giữ lại danh tính chính xác của nó (ví dụ: nó không 't làm suy giảm thành "C: \ Users \\ Desktop" nhưng thay vào đó tạo ra một PIDL thực sự trỏ tới màn hình ảo.

Bí quyết cho tôi là luôn sử dụng CSIDL-> PIDL, không bao giờ đi đến một chuỗi giữa CSIDL-> PIDL-> string-> PIDL = thoái hóa thành đường dẫn không phải ảo.

Cảm ơn mọi người đã giúp đỡ - và tôi sẽ tiếp tục tìm kiếm nếu có ai tìm thấy nhiều hơn về chủ đề và đăng nó, tôi muốn được quan tâm!;)

+0

Thú vị câu hỏi. Và chúc may mắn đối phó với thư mục chế độ thần trong vista/7 (http://www.downloadsquad.com/2010/01/03/stupid-windows-7-trick-unlock-the-secret-god-mode-folder/) –

+0

liên kết thú vị. Nó ảnh hưởng đến tôi không hề - nhưng thú vị của nó :) – Mordachai

Trả lời

5

Nếu tôi hiểu chính xác bạn đang tìm kiếm CSIDL s (trước Vista, bao gồm Shlobj.h) hoặc KNOWNFOLDERID (> = Vista, Knownfolders.h).

+0

Thú vị! Đạo diễn cho liên kết –

+0

Rõ ràng anh ta không bận tâm kiểm tra MSDN đầu tiên =/ –

2

Tôi nghi ngờ bạn sẽ tìm thấy MSDN article này hữu ích.

1

Tôi không nghĩ rằng các GUID này được ghi lại chính thức. Bạn có thể sử dụng SHGetPathFromIDList() để có được GUID. Nó sẽ cho biết thất bại, nhưng nếu bạn nhìn vào tham số pszPath bạn sẽ thấy nó được điền bằng GUID (tuy nhiên, ký tự đầu tiên được đặt thành NULL). Bên cạnh đó, bạn có thể tìm thấy các danh sách khác nhau của GUIDS được phát hiện bởi những người khác.

EDIT: Tôi đã tìm thấy một vài liên kết thú vị; có vẻ như bạn có thể khám phá những GUID này bằng cách tìm kiếm sổ đăng ký.

A forum posting about shell GUIDs

Control Panel GUIDs

How shell namespaces are installed

+0

Chạy dưới Vista, biên dịch với VS2008 và có exe của tôi được đánh dấu là vista-aware (điều khiển chung 6.0 trong tệp kê khai), tôi không nhận được GUID khi tôi thực hiện SHGetPathFromIDList() - thay vì tôi nhận được cùng một điều như SHParseDisplayName() (tức là một đường dẫn chuỗi đơn giản hoặc tên thư mục, nhưng không bao giờ là GUID) – Mordachai

+0

Bạn sẽ chỉ nhận được GUID cho các đối tượng ảo; đối tượng "vật lý" sẽ vẫn trả về đường dẫn tệp. – Luke

+1

Nhưng đó là điều: CSIDL_DESKTOP là cả một thư mục ảo và thực. Và tôi chưa tìm được cách nào để dỗ dành hệ điều hành để đưa tôi trở lại GUID - chỉ có thư mục thực (không phải là thứ tôi cần) – Mordachai