【问题标题】:What does this error mean: "error C2664 cannot convery arguement 7 from 'TCHAR (*)[261]' to 'LPSTR'此错误是什么意思:“错误 C2664 无法将参数 7 从 'TCHAR (*)[261]' 转换为 'LPSTR'
【发布时间】:2021-08-03 08:29:47
【问题描述】:

我是编码新手,我不太确定如何解决这个问题。错误如下:

错误 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);
        }
    }
}

【问题讨论】:

    标签: c++ tchar c2664 lpstr


    【解决方案1】:

    在GetVolumeInformation() 的lpFileSystemNameBuffer 参数中,您传入了一个指向TCHAR[261] 数组的指针(即指针的类型是TCHAR(*)[261]),但该参数需要一个指向@987654325 的指针@ 代替(即指针的类型是TCHAR*)。 TCHAR(*)[261] 指针不能隐式转换为 TCHAR* 指针,这就是编译器抱怨的原因。

    是的,GetVolumeInformation() 想要你提供一个指向可以容纳MAX_PATH (260) 个字符的内存缓冲区的指针。但它需要一个指向该缓冲区第一个字符的指针,而不是指向缓冲区本身的指针。这两个指针在逻辑上可能表示相同的内存地址,但在 C++ 中它们在技术上是不同的类型。 Win32 API 是基于 C 的 API,而不是基于 C++ 的 API。

    调用GetVolumeInformation() 时,只需将&amp;fileSystemName 更改为fileSystemName,并使其衰减 成为指向第一个字符的指针。就像您已经在使用 volumeName 一样。

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

    否则,请更明确地获取第一个字符的地址。将&amp;fileSystemName改为&amp;fileSystemName[0](与volumeName相同):

    GetVolumeInformation(..., &volumeName[0], ..., &fileSystemName[0], ...);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多