C++ C++;文本宏中的字符串变量

C++ C++;文本宏中的字符串变量,c++,winapi,C++,Winapi,我正在为一个项目创建一个GUI,我需要知道如何使用带有变量的文本宏 这是我用于打印到UI的内容: SendMessage(console, EM_SETSEL, -1, 0); SendMessage(console, EM_REPLACESEL, 0, (LPARAM)TEXT(message)); “message”是一个字符串变量。我也试过用chars,但仍然有错误 我得到的错误是:Lmessage未定义 任何帮助都将不胜感激,谢谢 TEXT是一个宏,它可以根据其他宏(UNICODE更具

我正在为一个项目创建一个GUI,我需要知道如何使用带有变量的文本宏

这是我用于打印到UI的内容:

SendMessage(console, EM_SETSEL, -1, 0);
SendMessage(console, EM_REPLACESEL, 0, (LPARAM)TEXT(message));
“message”是一个字符串变量。我也试过用chars,但仍然有错误

我得到的错误是:Lmessage未定义


任何帮助都将不胜感激,谢谢

TEXT
是一个宏,它可以根据其他宏(
UNICODE
更具体地说)向宏的参数添加前导的
L

例如,
TEXT(“Foo”)
变成了
L“Foo”
,这是一个宽字符(
wchar\t
)字符串

当然,将
L
前导添加到变量中并不会使变量的内容变宽,它所做的一切基本上就是重命名变量,如代码所示,其中
TEXT(message)
变为
Lmessage


简而言之,您应该只对文字字符串使用它。

TEXT
是一个宏,它可以根据其他宏(
UNICODE
更具体地说)向宏的参数添加前导的
L

例如,
TEXT(“Foo”)
变成了
L“Foo”
,这是一个宽字符(
wchar\t
)字符串

当然,将
L
前导添加到变量中并不会使变量的内容变宽,它所做的一切基本上就是重命名变量,如代码所示,其中
TEXT(message)
变为
Lmessage


简而言之,您应该只对文字字符串使用它。

TEXT()
只对编译时文字有效,而不对变量有效。如果
消息
是ANSI字符串,您需要将其作为Unicode字符串发送,反之亦然,则必须在运行时使用
MultiByteToWideChar()
/
WideCharToMultiByte()
或等效项执行转换。

TEXT()
宏仅适用于编译时文本,而不适用于变量。如果
消息
是ANSI字符串,您需要将其作为Unicode字符串发送,反之亦然,那么您必须在运行时使用
MultiByteToWideChar()
/
WideCharToMultiByte()
或等效项执行转换。

什么是
消息
?它是什么类型的?你的目标是Unicode吗?我怀疑
message
std::string
,但应该是
std::wstring
。此时,您将编写
(LPARAM)message.c_str()
。一旦你破解了这个问题,你可能会学会如何使用C++风格的演员阵容,而不是C风格的演员阵容。个人来说,我只会放弃像文本这样的宏:因为Windows XP取代了9X家族,所以Windows操作系统一直是Unicode原生的,所以没有理由再让Windows应用程序不再Unicode。只需在C代码中使用WCHAR数组,在C++中使用STW::WStand,并用L.@ CysBECKE前缀文字:Windows NT系统的整个范围都是Unicode(UCS-2,稍后UTF 16),从Windows NT 3.1开始,1993年发布。@IInspectable:Windows XP之前的Windows NT版本与实现ANSI API的面向消费者的Windows 9X一起发布。所以XP代表了您可以瞄准的第一个版本的“Windows”,它只是Unicode本机版本。@ChrisBecke:这仍然有点误导。微软推出了针对Windows 95/98/ME的Microsoft Unicode层,将Windows API的宽字符版本引入到这些系统中。随着2001年7月平台SDK的发布,无论目标是什么,都没有理由不使用Unicode。距离Windows XP正式上市还有几个月。什么是
消息
?它是什么类型的?你的目标是Unicode吗?我怀疑
message
std::string
,但应该是
std::wstring
。此时,您将编写
(LPARAM)message.c_str()
。一旦你破解了这个问题,你可能会学会如何使用C++风格的演员阵容,而不是C风格的演员阵容。个人来说,我只会放弃像文本这样的宏:因为Windows XP取代了9X家族,所以Windows操作系统一直是Unicode原生的,所以没有理由再让Windows应用程序不再Unicode。只需在C代码中使用WCHAR数组,在C++中使用STW::WStand,并用L.@ CysBECKE前缀文字:Windows NT系统的整个范围都是Unicode(UCS-2,稍后UTF 16),从Windows NT 3.1开始,1993年发布。@IInspectable:Windows XP之前的Windows NT版本与实现ANSI API的面向消费者的Windows 9X一起发布。所以XP代表了您可以瞄准的第一个版本的“Windows”,它只是Unicode本机版本。@ChrisBecke:这仍然有点误导。微软推出了针对Windows 95/98/ME的Microsoft Unicode层,将Windows API的宽字符版本引入到这些系统中。随着2001年7月平台SDK的发布,无论目标是什么,都没有理由不使用Unicode。离Windows XP正式上市还有几个月的时间。