Прошу помочь в приведении типов.
Ошибка: 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);
}
}
В WinApi многие функции имеют две версии:
char
wchar_t
Названия таких функций отличаются последней буквой: A
для char
, W
для wchar_t
. Помимо этого имеется макрос, который в зависимости от настроек проекта (считай некой константы, заданной через #define
) позволяет вызывать ту или иную функцию, не указывая суффикс A
/W
вовсе.
Т.о. если нужно всегда опираться на тип char
используйте A
-функцию, для wchar_t
- W
-функцию. В случае, когда хочется сделать универсальный вариант, используйте функцию без суффикса. Но тогда и типы переменных, используемых как аргументы подобных функций должны быть заданы неявно. Т.е. вместо char
и wchar_t
нужно использовать TCHAR
, который развернётся в нужный тип в зависимости от настроек символьного типа проекта (по сути от того, определёна ли константа _UNICODE
). Более подробно можно например почитать тут.
Используйте ASCII-вариант функции, LookupPrivilegeNameA()
.
Исходная функция LookupPrivilegeName()
— это на самом деле макрос, разворачивающийся либо в ASCII, либо Unicode вариант в зависимости от флагов компиляции.
Из-за своей «двойственной» природы такие функции требуют и «двойственных» типов данных — LPTSTR
для указателя на строку и TCHAR
+ TEXT()
для символа. При использовании же char
или wchar_t
необходимо использовать и конкретные версии функций, с суффиксами A
и W
соответственно.
Если вы работаете с юникодной версией (а с какой ещё? 2017 год на дворе!), переходите на широкие юникодные строки.
Замените определение ucPrivilegeName
на
WCHAR ucPrivilegeName[500];
При выводе юникодных строк используйте wprintf
и т. д.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Есть клиенты на C++, которые транслируют кадры с веб-камер на HTTP-серверНекоторые камеры отдают перевёрнутые кадры, и нужно программно анализировать...
В С есть тип longСогласно: Wiki c-types он занимет в памяти 4 байта, да и диапазон значений у него такой же как и у int
В этом PL/SQL коде есть вот такой код: l_balance:=account_balance(account_id_in)Вот эту строку кода не могу понять