char* to LPWSTR

442
15 февраля 2017, 23:00

Прошу помочь в приведении типов.

Ошибка: error C2664: 'LookupPrivilegeNameW' : cannot convert parameter 3 from 'char *' to 'LPWSTR' в функции LookupPrivilegeName(), третий параметр.

Мне кажется я перепробовала все что можно, но ничего не получается.

#include "StdAfx.h"
#include <windows.h>
#include <stdio.h>
#pragma hdrstop
/*LPWSTR CharToLPWSTR(LPCSTR char_string) 
{
    LPWSTR res;
    DWORD res_len = MultiByteToWideChar(1251, 0, char_string, -1, NULL, 0);
    res = (LPWSTR)GlobalAlloc(GPTR, (res_len + 1) * sizeof(WCHAR));
    MultiByteToWideChar(1251, 0, char_string, -1, res, res_len);
    return res;
}*/
int main()
{
    HANDLE hToken;
    LUID setcbnameValue;
    TOKEN_PRIVILEGES tkp;
    DWORD errcod;
    LPVOID lpMsgBuf;
    LPCTSTR msgptr;
    UCHAR InfoBuffer[1000];
    PTOKEN_PRIVILEGES ptgPrivileges = (PTOKEN_PRIVILEGES)InfoBuffer;
    DWORD dwInfoBufferSize;
    DWORD dwPrivilegeNameSize;
    DWORD dwDisplayNameSize;
    UCHAR ucPrivilegeName[500];
    UCHAR ucDisplayName[500];
    DWORD dwLangId;
    UINT i;
    if(!OpenProcessToken( GetCurrentProcess(),
        TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
    {
        puts("OpenProcessToken");
        return;
    }
    GetTokenInformation(hToken, TokenPrivileges, InfoBuffer,
        sizeof InfoBuffer, &dwInfoBufferSize);
    printf("Account privileges: \n\n");
    for(i = 0; i < ptgPrivileges->PrivilegeCount; i++)
    {
        dwPrivilegeNameSize = sizeof ucPrivilegeName;
        dwDisplayNameSize = sizeof ucDisplayName;
        LookupPrivilegeName(NULL, &ptgPrivileges->Privileges[i].Luid,
            (char *)ucPrivilegeName, &dwPrivilegeNameSize);
        /*LookupPrivilegeDisplayName(NULL, (char *)ucPrivilegeName,
            (char *)ucDisplayName, &dwDisplayNameSize, &dwLangId);*/
        printf("%s   (%s)\n", ucPrivilegeName);//, ucDisplayName);
    }
}
Answer 1

В WinApi многие функции имеют две версии:

  • одна для символов типа char
  • другая для символов типа wchar_t

Названия таких функций отличаются последней буквой: A для char, W для wchar_t. Помимо этого имеется макрос, который в зависимости от настроек проекта (считай некой константы, заданной через #define) позволяет вызывать ту или иную функцию, не указывая суффикс A/W вовсе.

Т.о. если нужно всегда опираться на тип char используйте A-функцию, для wchar_t - W-функцию. В случае, когда хочется сделать универсальный вариант, используйте функцию без суффикса. Но тогда и типы переменных, используемых как аргументы подобных функций должны быть заданы неявно. Т.е. вместо char и wchar_t нужно использовать TCHAR, который развернётся в нужный тип в зависимости от настроек символьного типа проекта (по сути от того, определёна ли константа _UNICODE). Более подробно можно например почитать тут.

Answer 2

Используйте ASCII-вариант функции, LookupPrivilegeNameA().

Исходная функция LookupPrivilegeName() — это на самом деле макрос, разворачивающийся либо в ASCII, либо Unicode вариант в зависимости от флагов компиляции.

Из-за своей «двойственной» природы такие функции требуют и «двойственных» типов данных — LPTSTR для указателя на строку и TCHAR + TEXT() для символа. При использовании же char или wchar_t необходимо использовать и конкретные версии функций, с суффиксами A и W соответственно.

Answer 3

Если вы работаете с юникодной версией (а с какой ещё? 2017 год на дворе!), переходите на широкие юникодные строки.

Замените определение ucPrivilegeName на

WCHAR ucPrivilegeName[500];

При выводе юникодных строк используйте wprintf и т. д.

READ ALSO
Анализ кадра с камеры на предмет перевёрнутого изображения

Анализ кадра с камеры на предмет перевёрнутого изображения

Есть клиенты на C++, которые транслируют кадры с веб-камер на HTTP-серверНекоторые камеры отдают перевёрнутые кадры, и нужно программно анализировать...

410
Преобразование типов в С++

Преобразование типов в С++

Определение типов:

388
Зачем нужен тип long когда есть int?

Зачем нужен тип long когда есть int?

В С есть тип longСогласно: Wiki c-types он занимет в памяти 4 байта, да и диапазон значений у него такой же как и у int

309
Можете объяснить суть этого pl/sql кода?

Можете объяснить суть этого pl/sql кода?

В этом PL/SQL коде есть вот такой код: l_balance:=account_balance(account_id_in)Вот эту строку кода не могу понять

304