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

Posted

技术标签:

【中文标题】C++:使用 TEXT() 函数 windows.h 时出错【英文标题】:C++ : Error while using TEXT() function windows.h 【发布时间】:2021-04-27 12:18:23 【问题描述】:

我最近从 Visual Studio Code 切换到 Visual Studio 2019,因为我想使用 VCPKG 下载 C++ 包。

我的代码适用于 Visual Studio Code,但不适用于 Visual Studio 2019,可能是因为它不是同一个编译器。

我在 *** 帖子 (Get Computer Name and logged user name) 上找到的代码检索 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 未定义”。我不明白这个错误,另外我声明了 infoBuf 而不是 LinfoBuf。我没有在 MSND 文档中找到使用 的 GetUserName 函数,但我使用标题

找到了 GetUserNameA

【问题讨论】:

TEXT 宏用于字符串文字,而不是变量。 c_pcc_user 是什么? c_pc 和 c_user 是我班级的属性。它们应该存储计算机名称和 PC 的用户名。我在声明构造函数时存储值 属性的类型有哪些? 我在课堂上将 c_pc 和 c_user 声明为字符串 你的意思是std::string 【参考方案1】:

根据Windows.h头文件,TEXT()不是一个函数,它是一个宏。其目的是在编译时将字符串/字符文字转换为 wchar_tchar 文字,具体取决于是否定义了 UNICODE 条件。

TEXT的定义基本上是这样的,

#ifdef UNICODE
#define __TEXT(quote) L##quote

#else
#define __TEXT(quote) quote

#endif
#define TEXT(quote) __TEXT(quote)

在 C++ 中,窄字符串文字表示为 "some string",而宽字符串文字表示为 L"some string"。宏中的##,就像我们在上面看到的那样,将标记连接在一起。在这种情况下,当定义UNICODE 时,在宏参数前面连接L。所以当我们说TEXT("Hello")时,当定义UNICODE时,预处理器输出为L"Hello",否则输出为"Hello"

由于infoBuf 不是字符串文字,而是指针,所以当您使用TEXT(infoBuf) 时,编译器会将其解析为LinfoBuf,其中L 来自宏转换。

GetComputerNameGetUserName 分别是 GetComputerNameA/GetComputerNameWGetUserNameA/GetUserNameW 函数的宏包装器。这些函数将名称输出为charwchar_t 字符串。当定义UNICODE 时,使用W 函数,否则使用A 函数。所以,如果c_pcc_userchars 的容器(如std::string),你最好的选择是直接使用GetComputerNameAGetUserNameA,例如:

#define INFO_BUFFER_SIZE 32767
CHAR   infoBuf[INFO_BUFFER_SIZE];
DWORD  bufCharCount = INFO_BUFFER_SIZE;

Constructor::Contructor(): c_online(true), c_status("Alive"), c_master("Master IP"), c_port(80) 


  bufCharCount = INFO_BUFFER_SIZE;
  if (GetComputerNameA(infoBuf, &bufCharCount))
   
    c_pc = infoBuf;
  

  bufCharCount = INFO_BUFFER_SIZE;
  if (GetUserNameA(infoBuf, &bufCharCount))
  
    c_user = infoBuf;
  

【讨论】:

Re: "ASCII strings (char*)" -- 宏适用于字符串文字;它不适用于char*。字符串文字是用双引号括起来的文本。这就是整个问题:infoBuf 是某种指针,所以它不是 字符串文字。 "abcd" 是字符串文字,L"abcd" 是宽字符串文字。两者都不是指针。由于字符串文字是char 的数组(或wchar_t,如果它是宽字符串文字),在大多数情况下,它衰减 为指向其第一个元素的指针。但它不是指针。 请注意std::strings 不是char*s 的容器”。他们持有char 元素,而不是char* 元素。 @PeteBecker 是的,对不起。对术语有点困惑。

以上是关于C++:使用 TEXT() 函数 windows.h 时出错的主要内容,如果未能解决你的问题,请参考以下文章

安卓其他Windows下的C++网络请求

C++用ShellExecute传递参数的问题

在 Windows 中使用 swig 从 Java 调用 c++ 函数,得到 java.lang.UnsatisfiedLinkError

使用 C++ 在 Windows 中获取时区

MFC C++ 在回调函数中编辑 Windows 控件

python3使用ctypes在windows中访问C和C++动态链接库函数示例