WriteConsole()奇怪的字符?

我使用这个片段来创build一个DLL里面的控制台。 该dll被加载在游戏中。

代码片段

控制台窗口创build罚款。 但是,当我写东西给它,我只是得到像“??? D ??”的东西。

我知道我必须使用printf()语法。 所以我使用

wprintf("%s", "test"); 

任何指针?

尝试使用:

 wprintf(L"%s", "test"); 

因为wprintf需要一个宽字符串作为输入

编辑 :基于在wprintf中使用%s和%S的行为改变的事实:

 wprintf("%s", L"test"); 

wprintf中的%s需要这个L“test”所在的宽字符串。
我删除了格式参数的“L”,因为wprintf被定义为:

 int wprintf(char *fmt, ...) 

您正在调用printf()例程的“宽字符”版本wprintf()。 这些“宽字符”功能有一个令人讨厌的地方,那就是“%s”的含义发生了变化:

printf() – “%s”表示参数是普通字符串,“%S”表示是一个宽字符串

wprintf() – “%s”表示参数是一个宽字符串,“%S”表示这是一个普通的字符串

所以你对wprintf()的调用是告诉它参数是一个宽字符的字符串,但不是:将其改为

 printf("%s", "test"); 

一个好习惯是使用可移植性宏_T(),当我们使用ASCII并且在UNICODE被定义的时候,所有的字符串都用L来预先设置。 并且使用_t前缀函数,当我们使用ASCII时,它们实际上只是映射到普通函数的宏,而在定义UNICODE时映射到了前缀函数。 这样,你总是有一个可移植的代码 – 这两个版本的作品:

 _tprintf(_T("%s"),_T("test"); 

“%s”格式字符串告诉wprintf它应该将第一个参数解释为宽字符字符串。

为了避免这些混合编码问题,可以使用TCHAR宏:

 LPCTSTR pName = _T("World"); _tprintf( _T("%s, %s"), _T("Hello"), pName ); 

你的编码是错误的,因为你正在使用wstring字符,但可能只有一个ascii控制台。 确保您在控制台中使用了unicode字体。