Прошу помочь в приведении типов.
Ошибка: 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 многие функции имеют две версии:
charwchar_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 и т. д.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости