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 文档中找到使用
【问题讨论】:
TEXT
宏用于字符串文字,而不是变量。 c_pc
和 c_user
是什么?
c_pc 和 c_user 是我班级的属性。它们应该存储计算机名称和 PC 的用户名。我在声明构造函数时存储值
属性的类型有哪些?
我在课堂上将 c_pc 和 c_user 声明为字符串
你的意思是std::string
?
【参考方案1】:
根据Windows.h
头文件,TEXT()
不是一个函数,它是一个宏。其目的是在编译时将字符串/字符文字转换为 wchar_t
或 char
文字,具体取决于是否定义了 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
来自宏转换。
GetComputerName
和 GetUserName
分别是 GetComputerNameA
/GetComputerNameW
和 GetUserNameA
/GetUserNameW
函数的宏包装器。这些函数将名称输出为char
或wchar_t
字符串。当定义UNICODE
时,使用W
函数,否则使用A
函数。所以,如果c_pc
和c_user
是char
s 的容器(如std::string
),你最好的选择是直接使用GetComputerNameA
和GetUserNameA
,例如:
#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::string
s 不是“char*
s 的容器”。他们持有char
元素,而不是char*
元素。
@PeteBecker 是的,对不起。对术语有点困惑。以上是关于C++:使用 TEXT() 函数 windows.h 时出错的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows 中使用 swig 从 Java 调用 c++ 函数,得到 java.lang.UnsatisfiedLinkError