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 变体(GetMessageWDispatchMessageW 等)。您不能使用 ANSI 版本,除非您对有时不会失败的应用程序感到满意。

【讨论】:

以上是关于Winapi - 将 LPWCSTR 作为 LPCSTR 传递的主要内容,如果未能解决你的问题,请参考以下文章

LPC2138微控制器之定时器看门狗VIC实例

LPC1114,怎么通过设置PWMC来确定哪个引脚作为PWM输出,原理是啥?

将位图图像加载到 WINApi C++ 并显示

自定义控件,winapi

为LPC1549 LPCXpresso评估板开发基于mbed的项目

功能实现:PLC对LPC的音量控制