Winapi - 将 LPWCSTR 作为 LPCSTR 传递
Posted
技术标签:
【中文标题】Winapi - 将 LPWCSTR 作为 LPCSTR 传递【英文标题】:Winapi - passing LPWCSTR as LPCSTR 【发布时间】:2020-01-09 15:06:09 【问题描述】:我使用扩展为 CreateWindowExA 的 CreateWindowEx。该函数使用 LPCSTR 类型。我想作为第二个参数传递 MSFTEDIT_CLASS(来自 Richedit.h):
#define MSFTEDIT_CLASS L"RICHEDIT50W"
以下转换不起作用:
(LPCSTR)MSFTEDIT_CLASS
CreateWindowEx 返回 NULL。当我以这种方式传递第二个参数时它会起作用:
"RICHEDIT50W"
但我不想从标题中复制字符串。如何解决?
【问题讨论】:
您是否有不能使用 CreateWindowExW 的原因?CreateWindowEx
将扩展为 CreateWindowExA
或 CreateWindowExW
,具体取决于 UNICODE
宏的存在。
这个控件能否在 ANSI 模式下正确运行是非常值得怀疑的。 Afaik 没有 RICHEDIT50A 类,就像以前版本的控件一样。尽管有 RTF 的遗留问题,他们还是做了很多工作来在这个版本中更好地支持 Unicode。唯一明智的建议是使用 RICHEDIT_CLASSA(2.0 版)
以下转换不起作用: -- 如果您删除转换并重新编译代码,编译器会告诉您代码将无法正常工作。通过强制转换,您告诉编译器“保持安静,我知道我在做什么”,但您会看到这样做的后果。
2020 年完全没有理由构建多字节应用程序。切换到 Unicode。
【参考方案1】:
这里只有一个可行的解决方案:直接调用CreateWindowExW
,或者通过定义UNICODE
预处理器符号并将通用文本映射CreateWindowEx
扩展为CreateWindowExW
。
您创建的窗口始终是 Unicode 窗口。用于与窗口通信的字符集在类注册时设置。名为"RICHEDIT50W"
的窗口类由系统使用RegisterClassExW 注册。你无法控制它。
由于您最终将不得不使用消息与窗口对话,因此您将需要使用消息处理函数的 Unicode 变体(GetMessageW
、DispatchMessageW
等)。您不能使用 ANSI 版本,除非您对有时不会失败的应用程序感到满意。
【讨论】:
以上是关于Winapi - 将 LPWCSTR 作为 LPCSTR 传递的主要内容,如果未能解决你的问题,请参考以下文章
LPC1114,怎么通过设置PWMC来确定哪个引脚作为PWM输出,原理是啥?