2016-08-22 2 views
-3

Невозможно выяснить, как работать со всеми этими «широкими рядами Unicode». Может ли кто-нибудь сказать мне, что я делаю неправильно? Я просто хочу, чтобы получить все локальные группы пользователей, так что я делать:C++ не может получить локальные группы пользователей с помощью NetUserGetGroups()

LPBYTE buffer; 
DWORD entries, total_entries; 
NetUserGetLocalGroups(NULL, L"rovnyart", 0, LG_INCLUDE_INDIRECT, &buffer, MAX_PREFERRED_SIZE, &entries, &total_entries); 
LOCALGROUP_USERS_INFO_0 *groups = (LOCALGROUP_USERS_INFO_0 *) buffer; 

unsigned int i; 
for (i=0; i<entries;i++) 
    wprintf(L"%s\n", groups[i].lgrui0_name); 

И это то, что я получаю:

t 
╝4╝<╝8╝=╝8╝A╝B╝@╝0╝B╝>╝@╝K╝ 
╝>╝;╝L╝7╝>╝2╝0╝B╝5╝;╝8╝ 

Process finished with exit code 0 

Мои окна язык русский, но я создал одну группу под названием «testgroup1» , и, как вы можете видеть, он тоже не отображается правильно.

я попытался wprintf() - результат был тот же :(

Что я делаю неправильно

UPD:

Хорошо, я изменил код в соответствии с вашими советами я создал группу под названием?. . «тест», который не является кириллица и кладу пользователя есть

sorry for non-english text

Вот мой код:

LPBYTE pBuf = NULL; 

NET_API_STATUS nStatus; 
DWORD entries, total_entries; 
nStatus = NetUserGetLocalGroups(NULL, L"rovnyart", 0, LG_INCLUDE_INDIRECT, &pBuf, MAX_PREFERRED_LENGTH, &entries, &total_entries); 

LOCALGROUP_USERS_INFO_0 *groups = (LOCALGROUP_USERS_INFO_0 *) pBuf; 
if (nStatus == 0) { 
    unsigned int i; 

    for (i = 0; i < entries; i++) 
     wprintf(L"%s\n", groups[i].lgrui0_name); 


    NetApiBufferFree(pBuf); 
} 

Вот результат:

t 
╝4╝<╝8╝=╝8╝A╝B╝@╝0╝B╝>╝@╝K╝ 
╝>╝;╝L╝7╝>╝2╝0╝B╝5╝;╝8╝ 

Process finished with exit code 0 
+3

В документе [документация] содержится полностью рабочий пример кода (https://msdn.microsoft.com/en-us/library/windows/desktop/aa370655.aspx). – IInspectable

+1

Я бы отметил, что ваш код не проверяет успех, не обнуляет выходы и передает '-1' как' prefmaxlen'. (В образце документации используется «MAX_PREFERRED_LENGTH») – Hasturkun

+0

Удивительно, что люди пытаются выполнить код с API, не прочитав сначала документацию. Значит ли это когда-нибудь хорошо для кого-то? –

ответ

0

Спасибо всем, в том числе ребята, которые downvoted меня. Решение моей проблемы было в спецификаторе формата %s. Мне нужно использовать %S программу .my правильно выводит названия групп с:

wprintf(L"%S\n", groups[i].lgruiu0_name); 

Хотя этот код ошибки Осроена в моем CLion, он работает по какой-то причине.

Благодарим за все полезные ссылки.

+0

Это очень маловероятно. [LOCALGROUP_USERS_INFO_0] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa370282.aspx) хранит широкую строку символов. Спецификатор '% S' инструктирует' wprintf' интерпретировать свой строковый параметр как строку MBCS (узкая). Это ошибка в вашей среде сборки? Какие результаты вы используете вместо Visual Studio? – IInspectable

+0

Измените его на 'wprintfs (L"% s \ n ", ...)'. Используйте '_setmode', как предложено [здесь] (http://stackoverflow.com/a/36527398/4603670) для печати Unicode на консоли. Вероятно, 'groups [i] .lgruiu0_name' выглядит хорошо, если вы тестируете его с помощью MessageBoxW –

+0

. Я рекомендую избегать всего беспорядка с помощью MessageBoxW() для вашего диагностического вывода, а не для вывода на консоль. –