当我定义UNICODE和/或_UNICODE时,非unicode API函数会发生什么?

时间:2015-03-22 00:33:33

标签: c++ visual-studio unicode

在MS Visual Studio中,当您不设置字符集时,AfxMessageBox()(以及无数其他API函数)之类的内容将很乐意接受CStringA参数。但是,当您将字符集设置为Unicode时,看起来完全相同的函数只会接受CStringW个参数。

现在这正是文档所说的应该发生的......但...... 那些非Unicode API函数到底在哪里?它们是否仍然存在于其他名称下(AfxMessageBoxA()或许?)。通过什么魔法消失,另一个API出现在它的位置......或者......通过什么恶作剧的黑客技巧可以让它们再次出现?如果有可能在Unicode存在的情况下重新出现它们,那么(明智地)是否应该使用这样的黑客恶作剧?

1 个答案:

答案 0 :(得分:1)

afxwin.h中AfxMessageBox()的声明是:

   int AFXAPI AfxMessageBox(LPCTSTR lpszText, UINT nType = MB_OK,
                            UINT nIDHelp = 0);

LPCTSTR适应字符串类型。如果使用UNICODE进行编译,则它是const wchar_t*的别名。没有它是const char*。没有AfxMessageBoxA()版本。

这与winapi函数的工作方式非常不同,因为这是一个不同的C ++函数。从技术上讲,他们可能提供了另一个功能的重载,他们没有。您还需要不同的链接需求,您需要链接MFC库的非Unicode版本以保持链接器满意。值得注意的是,它已被弃用,不再附带最新的VS版本,但仍然可以(现在)单独下载。

这应该回答你的问题,它不会去任何地方,它根本就不存在。混音不起作用,你需要A2W()来转换字符串。当然,如果需要,你可以简单地编写自己的重载。