web-dev-qa-db-ja.com

マイドキュメントへのパスを取得する

Visual C++から、現在のユーザーのマイドキュメントフォルダーへのパスを取得するにはどうすればよいですか?

編集:

私はこれを持っています:

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

ただし、resultE_INVALIDARGの値で戻ってきます。なぜそうなるのかについて何か考えはありますか?

17
Smashery

互換性が必要なシステムの古さによって異なります。古いシステムの場合、 SHGetSpecialFolderPath があります。やや新しいシステムの場合、 SHGetFolderPath があります。 Vista以降、 SHGetKnownFolderPath があります。

少なくとも私のマシンで機能するデモコードは次のとおりです。

#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;
}
21
Jerry Coffin

SHGetFolderPath Windows API関数 を使用し、CSIDL_MYDOCUMENTSを要求します。

9
James McNellis

ユーザーがWin7ドキュメントライブラリのデフォルトの保存フォルダーを変更した場合、CSIDL_PERSONALは目的のフォルダーを返さないことに注意してください。適切なフォルダを取得するには、SHLoadLibraryFromKnownFolderを使用してドキュメントライブラリのIShellLibraryを取得し、IShellLibrary::GetDefaultSaveFolderを使用してライブラリのデフォルトの保存用のIShellItemを取得する必要があります。フォルダー、最後にIShellItem::GetDisplayNameを使用してフォルダー名を取得します。

1
chrisd

Windows10のMFCアプリケーションでVisualStudio 2017を使用する SHGetKnownFolderPath関数 で次のコードスニペットを使用して、現在のユーザーのDocumentsフォルダーを取得します。

#include <string>     // include file for C++ native strings

//  . . .  other code.

PWSTR   ppszPath;    // variable to receive the path memory block pointer.

HRESULT hr = SHGetKnownFolderPath(FOLDERID_Documents, 0, NULL, &ppszPath);

std::wstring myPath;
if (SUCCEEDED(hr)) {
    myPath = ppszPath;      // make a local copy of the path
}

CoTaskMemFree(ppszPath);    // free up the path memory block

ドキュメントには、パス変数の使用法と返されるパスについて次のように記載されていることに注意してください。

ppszPath [out]

タイプ:PWSTR *

このメソッドが戻ると、既知のフォルダーのパスを指定するnullで終了するUnicode文字列へのポインターのアドレスが含まれます。呼び出しプロセスは、CoTaskMemFreeを呼び出すことにより、このリソースが不要になったら、このリソースを解放する責任があります。返されるパスには、末尾の円記号は含まれていません。たとえば、「C:\ Users \」ではなく「C:\ Users」が返されます。

可能なFOLDERID_引数のリストについては、MSDNの記事 KNOWN_FOLDER_FLAG列挙 を参照してください。

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;

このソリューションはどうですか?それは私にとってはうまく機能しています。

1
maxpayne