SHGetFolderPath возвращает "C", несмотря ни на что? - PullRequest
2 голосов
/ 07 ноября 2011

Я довольно новичок в разработке для Windows (опыт со стороны Mac) и пытаюсь использовать SHGetFolderPath (поскольку он совместим с Windows XP), чтобы получить путь к папке данных приложения для текущего пользователя. Тем не менее я получаю выходной путь «C» каждый раз, независимо от того, какой флаг я передаю. Я пробовал оба:

CSIDL_APPDATA

и

CSIDL_LOCAL_APPDATA

с и без флага CSIDL_FLAG_CREATE. Один и тот же результат каждый раз: «С». Что я тут не так делаю?

#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

Ответы [ 2 ]

8 голосов
/ 07 ноября 2011

Вы компилируете для Unicode, но передаете буфер ANSI.В вашем действующем коде есть состав, который вы нам не показываете.Либо передайте буфер wchar_t и используйте соответствующую процедуру печати, либо вызовите версию функции ANSI, SHGetFolderPathA.

0 голосов
/ 07 ноября 2011

изменить

CHAR path[MAX_PATH]; 

на

TCHAR path[MAX_PATH]; 

или даже лучше на

wchar_t path[MAX_PATH];

и использовать wprintf() и wcslen() вместо printf()и strlen().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...