Буфер GetCurrentDirectory не возвращает правильное значение - PullRequest
2 голосов
/ 06 ноября 2011

У меня проблема с GetCurrentDirectory(), и я не совсем понимаю, почему. Я не понимаю, что это работает для XP, но не для Seven (или, по крайней мере, на моем компьютере). Вот мой код:

char dir_name[1024]; // as a global variable
int get_files() {
// ...
DWORD dwRet;
dwRet = GetCurrentDirectory(MAX_PATH, dir_name);
printf("%s\n",dir_name);
printf("%d\n",dwRet);
//...
}

Этот код вернет:

printf("%s\n",dir_name); -> return "c"

printf("%d\n",dwRet); -> 42 (это правильная длина строки, которая должна быть возвращена)

Я не понимаю, почему dir_name принимает только значение "c".

Ответы [ 3 ]

3 голосов
/ 06 ноября 2011

Я думаю, результатом является Unicode в Windows Seven! и после каждого символа ASCII этой функции есть ноль. И вы печатаете его по printf. Вы должны использовать функции широких символов в вашей программе. Как wprintf.

Попробуйте следующий код: (протестировано в Visual Studio 2008 + Windows 7)

#include <stdio.h>
#include <windows.h>
#include <wchar.h>

WCHAR dir_name[1024]; // as a global variable

int get_files()
{
    // ...
    DWORD dwRet;
    dwRet = GetCurrentDirectory(MAX_PATH, dir_name);
    wprintf(L"%s\n", dir_name);
    printf("%d\n", dwRet);
    //...
    return 0;
}
2 голосов
/ 06 ноября 2011

Я не уверен, но может ли это быть GetCurrentDirectory() возвращает 2-байтовые символы в win7?

В этом случае вы будете получать 0 в каждую секунду возвращаемых массивов char.

Таким образом, вы должны использовать версию функции printf() с поддержкой широких символов, например wprintf().

Также мне интересно, не предупредил бы вас компилятор о том, что что-то не так с типами.

1 голос
/ 06 ноября 2011

Какой компилятор вы используете? В Visual C ++ 2005 GetCurrentDirectory - это макрос, который разрешается в GetCurrentDirectoryW, если определен макрос UNICODE, и в GetCurrentDirectoryA в противном случае. У вас есть UNICODE, определенный случайно?

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