2010-03-10 11 views
10

Visual C++ 'dan, geçerli kullanıcının Belgelerim klasörüne giden yolu nasıl alabilirim?Belgelerime yolu al

Düzenleme:

bu var:

TCHAR my_documents[MAX_PATH]; 
HRESULT result = SHGetFolderPath(NULL, CSIDL_MYDOCUMENTS, NULL, SHGFP_TYPE_CURRENT, my_documents); 

Ancak result geri E_INVALIDARG değeriyle geliyor. Bunun neden olabileceği hakkında bir fikrin var mı?

cevap

14

Bir sistemin kaç yaşında uyumluluğa sahip olduğuna bağlıdır. Eski sistemler için SHGetSpecialFolderPath var. Daha yeni sistemler için SHGetFolderPath var. Vista ile başlayarak, SHGetKnownFolderPath var.

Düzenleme: , CSIDL_MYDOCUMENTS kullanmak istemezsiniz. en azından benim makinede çalışır Demo kodu: kullanıcı Win7 Belgeler kitaplığında kaydetme klasörü varsayılan değiştiyse CSIDL_PERSONAL istenen klasörü dönmeyecektir

#include <windows.h> 
#include <iostream> 
#include <shlobj.h> 

#pragma comment(lib, "shell32.lib") 

int main() { 
    CHAR my_documents[MAX_PATH]; 
    HRESULT result = SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, my_documents); 

    if (result != S_OK) 
     std::cout << "Error: " << result << "\n"; 
    else 
     std::cout << "Path: " << my_documents << "\n"; 
    return 0; 
} 
+0

Teşekkürler - SHGetFolderPath'i denedim ve bir şey pek işe yaramıyor - bu konudaki düzenlememe bir göz atmak ister misiniz? – Smashery

+0

Çok teşekkür ederim! – Smashery

+0

Bu, şimdi yerleşik bir python gibi görünüyor. http://stackoverflow.com/questions/6227590/finding-the-users-my-documents-path – totowtwo

8

the SHGetFolderPath Windows API function kullanın ve CSIDL_MYDOCUMENTS isteyin.

+0

Bu bağlantıyı doğru düşünmüyorum, düzeltin: http://msdn.microsoft.com/en-us/library/bb762181%28VS.85%29.aspx – uray

+0

Teşekkürler - Bunu denedim ve bir şey değil Çalışırken - sorudaki düzenlememe bir göz atabilir misiniz? – Smashery

1

Not. Doğru klasörü almak için, IShellLibrary belgesini Belgeler kitaplığı için SHLoadLibraryFromKnownFolder kullanmanız gerekir, IShellLibrary::GetDefaultSaveFolder kütüphanesinin varsayılan kaydetme klasörü için IShellItem kullanın ve son olarak klasör adını almak için IShellItem::GetDisplayName kullanın.

1
std::string GetSystemFolderPaths(int csidl) 
{ 
    wchar_t Folder[1024]; 
    HRESULT hr = SHGetFolderPathW(0, CSIDL_MYDOCUMENTS, 0, 0, Folder); 
    if (SUCCEEDED(hr)) 
    { 
     char str[1024]; 
     wcstombs(str, Folder, 1023); 
     return str; 
    } 
    else return ""; 
} 

cout<<GetSystemFolderPaths(CSIDL_MYDOCUMENTS)<<endl; 

Bu çözüm nasıl olur? Benim için iyi çalışıyor.

+0

Görünüşe göre csidl argümanını kullanmadığınızı. İyi anlaşılır olsaydı, muhtemelen CSIDL_MYDOCUMENTS yerine SHGetFolderPathW() ikinci argümanı olarak konması gerekir. – BrunoLevy