Что означает эта ошибка: «ошибка C2664 не может преобразовать аргумент 7 из« TCHAR (*) [261] »в« LPSTR »

Я новичок в кодировании, и я не слишком уверен, как решить эту проблему. Ошибка заключается в следующем:

ошибка C2664: «BOOL GetVolumeInformationA (LPCSTR, LPSTR, DWORD, LPDWORD, LPDWORD, LPDWORD, LPSTR, DWORD)»: невозможно преобразовать аргумент 7 из «TCHAR (*) [261]» в «LPSTR»

Просто хочу получить четкий ответ о том, как я могу решить эту проблему, и объяснение того, что я сделал неправильно. Большое спасибо!

Раздел, в котором у меня возникли проблемы:

TCHAR volumeName[MAX_PATH + 1] = { 0 };
TCHAR fileSystemName[MAX_PATH + 1] = { 0 };
DWORD serialNumber = 0;
DWORD maxComponentLen = 0;
DWORD fileSystemFlags = 0;
if (GetVolumeInformation(_T("C:\\"), volumeName, ARRAYSIZE(volumeName), &serialNumber, &maxComponentLen, &fileSystemFlags, &fileSystemName, ARRAYSIZE(fileSystemName)));

И мой исходный код:

#include <Windows.h>
#include <iostream>
#include <stdlib.h>
#include <tchar.h>
#include <intrin.h>
#include <algorithm>
#include <TlHelp32.h>
#include <string>
#include <vector>

void setcolor(unsigned short color)
{
    HANDLE hcon = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hcon, color);
}

using namespace std;
vector<string> serial;

void loadserial()
{
    serial.push_back("HWIDS");
    serial.push_back("HWIDS");
    serial.push_back("HWIDS");
}


int main()
{
    loadserial();
    setcolor(10);
    std::cout << "Checking Whitelist...\n";
    Sleep(240);

    TCHAR volumeName[MAX_PATH + 1] = { 0 };
    TCHAR fileSystemName[MAX_PATH + 1] = { 0 };
    DWORD serialNumber = 0;
    DWORD maxComponentLen = 0;
    DWORD fileSystemFlags = 0;
    if (GetVolumeInformation(_T("C:\\"), volumeName, ARRAYSIZE(volumeName), &serialNumber, &maxComponentLen, &fileSystemFlags, &fileSystemName, ARRAYSIZE(fileSystemName)));

    while (true)
    {
        if (find(serial.begin(), serial.end(), to_string(serialNumber)) != serial.end())
        {
            std::cout << "Whitelisted\n";
            Sleep(2000);
            setcolor(15);
            system("cls");
            SetConsoleTitle("Loading Cheat...");
            setcolor(15);
            std::cout << "Loading...\n";
            Sleep(100);
            std::cout << "Loading (25%)\n";
            Sleep(200);
            std::cout << "Loading (50%)\n";
            Sleep(200);
            std::cout << "Loading (75%)\n";
            Sleep(200);
            std::cout << "Loading (100%)\n";
            Sleep(200);
            std::cout << "Done!\n";
            Sleep(1000);
            system("cls");
            SetConsoleTitle("Affinity");

            setcolor(5);

            setcolor(5);
            std::cout << "Welcome to Affinity\n";
            std::cout << "_________________\n";
            setcolor(12);
            std::cout << "\n";
            std::cout << "Pick Your Hack: \n";
            setcolor(10);
            std::cout << "Wallhacks: F5\n";
            setcolor(3);
            std::cout << "Bunnyhop: F6\n";
            setcolor(9);
            std::cout << "Radar: F7\n";
            setcolor(5);
            std::cout << "Exit: F8\n";

            std::cout << "\n";

            while (true)
            {
                if (GetAsyncKeyState(VK_F5))
                {
                    std::cout << "next episode\n";
                    Sleep(200);
                }

                if (GetAsyncKeyState(VK_F6))
                {
                    std::cout << "next episode\n";
                    Sleep(200);
                }

                if (GetAsyncKeyState(VK_F7))
                {
                    std::cout << "next episode\n";
                    Sleep(200);
                }

                if (GetAsyncKeyState(VK_F8))
                {
                    std::cout << "Closing\n";
                    Sleep(200);
                    system("cls");
                    std::cout << "Closing..\n";
                    Sleep(200);
                    system("cls");
                    std::cout << "Closing...\n";
                    Sleep(200);
                    system("cls");
                    std::cout << "Closing..\n";
                    Sleep(200);
                    system("cls");
                    std::cout << "Closing.\n";
                    Sleep(200);
                    system("cls");
                    std::cout << "Closing..\n";
                    Sleep(200);
                    system("cls");
                    std::cout << "Closing...\n";
                    Sleep(200);
                    system("cls");
                    exit(0);
                }
            }
        }
        else
        {
            setcolor(12);
            SetConsoleTitle("You're Not On The Whitelist ;(");
            std::cout << "You're not on the whitelist.\n";
            std::cout << "Your Serial/HWID is:";
            std::cout << serialNumber << std::endl;
            Sleep(15000);
            exit(0);
        }
    }
}

person Bennett Cooper    schedule 13.05.2021    source источник


Ответы (1)


В параметре lpFileSystemNameBuffer для GetVolumeInformation() вы передаете указатель на массив TCHAR[261] (т.е. тип указателя TCHAR(*)[261]), но вместо этого параметр ожидает указатель на TCHAR (т.е. тип указателя TCHAR*). Указатель TCHAR(*)[261] не может быть неявно преобразован в указатель TCHAR*, поэтому компилятор жалуется.

Да, GetVolumeInformation() хочет, чтобы вы предоставили ему указатель на буфер памяти, который может содержать MAX_PATH (260) символов. Но ему нужен указатель на 1-й символ этого буфера, а не указатель на сам буфер. Два указателя могут логически представлять один и тот же адрес памяти, но технически они являются разными типами в C++. Win32 API — это API на основе C, а не на C++.

При вызове GetVolumeInformation() просто измените &fileSystemName на fileSystemName и дайте ему превратиться в указатель на 1-й символ. Так же, как вы уже делаете с volumeName.

GetVolumeInformation(..., volumeName, ..., fileSystemName, ...);

В противном случае, будьте более точны в отношении получения адреса 1-го символа. Вместо этого измените &fileSystemName на &fileSystemName[0] (то же самое с volumeName):

GetVolumeInformation(..., &volumeName[0], ..., &fileSystemName[0], ...);
person Remy Lebeau    schedule 13.05.2021