我对Windows开发相当新(在Mac方面经验丰富),并且我正在尝试使用SHGetFolderPath(因为它与Windows XP兼容)来获取当前用户的app数据文件夹的路径。然而,无论我传递什么旗帜,我每次都会获得“C”的输出路径。我已经尝试了两种:
CSIDL_APPDATA
和
CSIDL_LOCAL_APPDATA
有和没有CSIDL_FLAG_CREATE标志。每次都有相同的结果:“C”。我在这里做错了什么?
#include <windows.h>
#include <shlobj.h> // SHGetFolderPath
#include <stdio.h>
#include <stdlib.h>
//#pragma comment(lib, "shell32.lib")
int main()
{
CHAR path[MAX_PATH];
HRESULT result = SHGetFolderPath(NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE, NULL, SHGFP_TYPE_CURRENT, path);
if (result != S_OK)
printf("Error: %d\n", result);
else
printf("Path: %s\n" , path);
printf( "String length: %d\n", strlen(path) );
return 0;
}
SHGetFolderPath的文档: http://msdn.microsoft.com/en-us/library/windows/desktop/bb762181(v=vs.85).aspx
答案 0 :(得分:8)
您正在编译Unicode但传递ANSI缓冲区。您的实际代码有一个您没有向我们展示的演员表。传递wchar_t缓冲区并使用匹配的打印例程,或调用函数的ANSI版本SHGetFolderPathA。
答案 1 :(得分:0)
更改
CHAR path[MAX_PATH];
到
TCHAR path[MAX_PATH];
甚至更好
wchar_t path[MAX_PATH];
并使用wprintf()
和wcslen()
代替printf()
和strlen()
。