Visual C++から、現在のユーザーのマイドキュメントフォルダーへのパスを取得するにはどうすればよいですか?
編集:
私はこれを持っています:
TCHAR my_documents[MAX_PATH];
HRESULT result = SHGetFolderPath(NULL, CSIDL_MYDOCUMENTS, NULL, SHGFP_TYPE_CURRENT, my_documents);
ただし、result
はE_INVALIDARG
の値で戻ってきます。なぜそうなるのかについて何か考えはありますか?
互換性が必要なシステムの古さによって異なります。古いシステムの場合、 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;
}
SHGetFolderPath
Windows API関数 を使用し、CSIDL_MYDOCUMENTS
を要求します。
ユーザーがWin7ドキュメントライブラリのデフォルトの保存フォルダーを変更した場合、CSIDL_PERSONALは目的のフォルダーを返さないことに注意してください。適切なフォルダを取得するには、SHLoadLibraryFromKnownFolder
を使用してドキュメントライブラリのIShellLibrary
を取得し、IShellLibrary::GetDefaultSaveFolder
を使用してライブラリのデフォルトの保存用のIShellItem
を取得する必要があります。フォルダー、最後にIShellItem::GetDisplayName
を使用してフォルダー名を取得します。
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列挙 を参照してください。
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;
このソリューションはどうですか?それは私にとってはうまく機能しています。