C++ C++;:使用TEXT()函数windows.h时出错
我最近从VisualStudio代码切换到VisualStudio 2019,因为我想用C++ vck.下载C++包。 我的代码适用于Visual Studio代码,但不适用于Visual Studio 2019,可能是因为它不是同一个编译器 我在StackOverflow post()上找到的代码检索计算机名和PC的用户名C++ C++;:使用TEXT()函数windows.h时出错,c++,windows,C++,Windows,我最近从VisualStudio代码切换到VisualStudio 2019,因为我想用C++ vck.下载C++包。 我的代码适用于Visual Studio代码,但不适用于Visual Studio 2019,可能是因为它不是同一个编译器 我在StackOverflow post()上找到的代码检索计算机名和PC的用户名 #define INFO_BUFFER_SIZE 32767 TCHAR infoBuf[INFO_BUFFER_SIZE]; DWORD bufCharCount =
#define INFO_BUFFER_SIZE 32767
TCHAR infoBuf[INFO_BUFFER_SIZE];
DWORD bufCharCount = INFO_BUFFER_SIZE;
SID_IDENTIFIER_AUTHORITY pIdentStruct = SECURITY_NT_AUTHORITY;
PSID ptrSidStruct;
BOOL isMember;
Constructor::Contructor(): c_online(true), c_status("Alive"), c_master("Master IP"), c_port(80)
{
bufCharCount = INFO_BUFFER_SIZE;
if (GetComputerName(infoBuf, &bufCharCount))
{
c_pc = TEXT(infoBuf);
}
bufCharCount = INFO_BUFFER_SIZE;
if (GetUserName(infoBuf, &bufCharCount))
{
c_user = TEXT(infoBuf);
}
}
但是,在使用TEXT()函数时,出现错误“LinfoBuf not define”。我不理解这个错误,而且我声明infoBuf不是LinfoBuf。我在MSND文档中没有找到使用的GetUserName函数,但我发现GetUserNameA使用了头文件,根据
Windows.h
头文件,TEXT()
不是函数,而是宏。其目的是在编译时将字符串/字符文本转换为wchar\u t
或char
文本,具体取决于UNICODE
条件是否定义
基本上,TEXT
的定义是这样的
#ifdef UNICODE
#定义文字(引号)L##引号
#否则
#定义文字(引号)引号
#恩迪夫
#定义文本(引号)\定义文本(引号)
在C++中,窄字符串文字被表示为<代码>“某些字符串”< /> >,宽字符串文字表示为<代码> L“某些字符串”< /代码>。宏中的##
与上面看到的一样,将令牌连接在一起。在这种情况下,当定义了UNICODE
时,在宏参数前面连接L
。因此,当我们说TEXT(“Hello”)
时,当定义UNICODE
时,预处理器的输出是L“Hello”
,否则输出是“Hello”
由于infoBuf
不是字符串文字,而是指针,当您使用TEXT(infoBuf)
时,编译器将其解析为LinfoBuf
,其中L
来自宏转换
GetComputerName
和GetUserName
分别是GetComputerNameA
/GetComputerNameW
和GetUserNameA
/GetUserNameW
函数的宏包装器。这些函数将名称输出为char
或wchar\t
字符串。定义UNICODE
时,将使用W
函数,否则将使用A
函数。因此,如果c_pc
和c_user
是char
s的容器(如std::string
),那么最好的选择是直接使用GetComputerNameA
和GetUserNameA
,例如:
#定义信息_缓冲区_大小32767
CHAR infoBuf[信息缓冲区大小];
DWORD bufCharCount=信息缓冲区大小;
Constructor::Constructor():c_联机(true)、c_状态(“活动”)、c_主控(“主IP”)、c_端口(80)
{
bufCharCount=信息缓冲区大小;
if(GetComputerNameA(infoBuf和bufCharCount))
{
c_pc=infoBuf;
}
bufCharCount=信息缓冲区大小;
if(GetUserNameA(infoBuf和bufCharCount))
{
c_user=infoBuf;
}
}
TEXT
宏用于字符串文本,而不是变量。什么是c_-pc
和c_-user
?c_-pc和c_-user是我的类的属性。它们应该存储计算机名和PC的用户名。我在声明构造函数时存储值属性的类型是什么?我在我的类中将c_PC和c_user声明为字符串你的意思是std::string
?Re:“ASCII字符串(char*)”--宏应用于字符串文字;它不适用于字符*
。字符串文字是用双引号括起来的文本。这就是全部问题:infoBuf
是某种指针,所以它不是字符串文字<代码>“abcd”是字符串文字,而L“abcd”
是宽字符串文字。两者都不是指针。由于字符串文字是char
的数组(如果是宽字符串文字,则为wchar\u t
),因此在大多数上下文中,它会衰减为指向其第一个元素的指针。但它不是指针。请注意,std::string
s不是“char*s的容器”。它们包含char
元素,而不是char*
元素。@PeteBecker是的,对不起,我的不好。对术语有点困惑。