2017-07-19 102 views
1

我继承了一个我无法构建的C++ visual studio项目。问题是像“CreateEvent”这样的很多api调用都会向它们提供char *输入,但错误代码需要“LPCWSTR”。这几乎是数百行代码,或多或少有类似的投诉。visual studio C++ UNICODE相关故障排除循环

寻找帮助,常见的解决方案似乎是我应该禁用Unicode字符集。但是,当我这样做时,出现“为非Unicode字符集构建MFC项目已被弃用”错误。寻找帮助,常见的解决方案似乎是我应该启用Unicode字符集。

因此,如果我这样做,我就会受到冲击,如果我不这样做,我会受到冲击。什么是正确的举动?

+0

可能你觉得这有用:https://stackoverflow.com/questions/19715144/how-to-convert-char-to-lpcwstr –

+0

你应该更新你的整个代码库以正确使用宽字符。其实这应该在15年前完成。 – VTT

+0

“char *”在UTF-8上仍然是标准。大多数软件工程师讨厌“wchar_t *”并为每个字符串表达式添加L.看起来像微软是唯一一个强迫程序员使用UNICODE的人。微软希望终止MBCS,但我认为这不会很快发生。 – JazzSoft

回答

2

CreateEvent本身不过是一个宏观#define“d是的这是在WinAPI的的synchapi.h

#ifdef UNICODE 
#define CreateEvent CreateEventW 
#else 
#define CreateEvent CreateEventA 
#endif // !UNICODE 

通常(至少在所有的Windows项目,我曾经工作)这实际上宣告了两个函数之一UNICODE宏被定义,因此实际上可以与CreateEventW函数一起使用,该函数接受LPCWSTR(换句话说const wchar_t*)字的参数,它应该是一个UTF-16字符串文字。 如果它没有在你的项目中定义,那么它使用CreateEventA,它接受LPCSTR参数(实际上相当于const char*),并将其视为ASCII字符串。

您的项目似乎已设置为仅支持ASCII字符串。还有......好吧,现在这已经被弃用了:)以前有一些特殊的附加组件支持这种情况的构建,叫做MFC MBCS DLL Add-on。但是,我不是100%确定它仍然可用,这里是a question here at StackOverflow about that

如果您没有找到这样的插件或任何其他解决方案,那么恐怕唯一的方法就是将它编译为Unicode字符串。实际上,即使您找到了解决方法,如果您要继续维护此项目,我建议您将此活动添加到您的待办事项中,因为此类解决方法可能随时停止存在。

无论如何,了解您的最终结果将会很有趣。

+0

我使用的是Visual Studio 2017,不需要安装MBCS插件,虽然它需要这意味着微软在这一点上意识到了MBCS的支持。 – JazzSoft

0

看来您正在使用Microsoft Visual Studio 2013.此版本分发时没有MFC的MBCS版本。另一方面,Visual Studio 2015和2017与MFC的MBCS版本一起提供。

如果你想建立MBCS你的项目,你需要下载和安装这个:

https://www.microsoft.com/en-us/download/details.aspx?id=40770

另一种选择是你的整个项目转换为Unicode,但是这可能是很多工作取决于你的项目。

+0

我有VS2015完全相同的问题 – n4rzul