问题描述
错误 C2664:“BOOL GetVolumeinformationA(LPCSTR,LPSTR,DWORD,LPDWORD,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:\\"),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);
}
}
}
解决方法
在lpFileSystemNameBuffer
的{{1}}参数中,你传入的是一个指向GetVolumeInformation()
数组的指针(即指针的类型是TCHAR[261]
),但是参数期待一个指向 TCHAR(*)[261]
的指针(即指针的类型是 TCHAR
)。 TCHAR*
指针不能隐式转换为 TCHAR(*)[261]
指针,这就是编译器抱怨的原因。
是的,TCHAR*
希望您为它提供一个指向可以容纳 GetVolumeInformation()
(260) 个字符的内存缓冲区的指针。但它需要一个指向该缓冲区第一个字符的指针,而不是指向缓冲区本身的指针。这两个指针在逻辑上可能代表相同的内存地址,但在 C++ 中它们在技术上是不同的类型。 Win32 API 是基于 C 的 API,而不是基于 C++ 的 API。
调用 MAX_PATH
时,只需将 GetVolumeInformation()
更改为 &fileSystemName
,然后让它衰减成为指向第一个字符的指针。就像您已经在使用 fileSystemName
一样。
volumeName
否则,请更明确地获取第一个字符的地址。将 GetVolumeInformation(...,volumeName,...,fileSystemName,...);
改为 &fileSystemName
(与 &fileSystemName[0]
相同):
volumeName