C++ C++;:使用TEXT()函数windows.h时出错

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 =

我最近从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 = 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是的,对不起,我的不好。对术语有点困惑。