C++中用writeconsole函数往控制台写字符串出现乱码,求救!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中用writeconsole函数往控制台写字符串出现乱码,求救!相关的知识,希望对你有一定的参考价值。

void ConLib::OutputString(char *String) //定义自己编写的conlib库,里面用outputstring包装一个 //writeconsole的函数

DWORD Written;
WriteConsole(m_Screen, String, strlen(String), &Written, NULL); //这是这个函数,m_Screen是先前获得 //的屏幕的句柄,这个没问题,测试过

然后我用这个函数进行
ConLib console;
console -> OutputString("this is a test!!!!!!");
输出为

一堆乱码,神奇的是还有个f:/这样一个盘符路径。。。请教各位这是怎么回事?谢谢

参考技术A DWORD是unsignedlong的 而且只有4个字节 其他你自己想吧追问

解决了,是工程字符集的问题,只要将项目的属性--常规--字符集--改成多字节 就可以了,这是是编译器编码的问题,但是为什么还要深究

本回答被提问者采纳

如何使用 WinApi 的 WriteConsole 打印 LOCAL 字节

【中文标题】如何使用 WinApi 的 WriteConsole 打印 LOCAL 字节【英文标题】:How to print LOCAL byte with WinApi's WriteConsole 【发布时间】:2021-05-11 12:45:37 【问题描述】:

我很难澄清我的问题,但我会尝试。我正在尝试学习 MASM32,我的任务是在控制台中打印一些文本而不使用 .data 或 .const。问题是 LOCAL 将变量放在堆栈上,而不是放在静态内存中。所以我无法获得他们的地址(偏移量),WriteConsole 使用指向内存中文本地址的指针。关于如何处理这个问题的任何想法?谢谢! 我有这个:

.data
string db 10 'somestring'

.code
WriteToConsole PROC 
    LOCAL handle :DWORD
    invoke GetStdHandle, -11
    mov handle, eax
    mov edx, offset string
    invoke WriteConsoleA, handle, edx, 10, 0, 0
    xor eax, eax
    ret
WriteToConsole ENDP

我想要这样的东西:

.code
WriteToConsole PROC 
    LOCAL string[10] :SBYTE
    LOCAL handle :DWORD
    invoke GetStdHandle, -11
    mov handle, eax
    mov edx, offset string ;impossible because of stack
    invoke WriteConsoleA, handle, edx, 10, 0, 0 ;can't call without a pointer
    xor eax, eax
    ret
WriteToConsole ENDP```

【问题讨论】:

【参考方案1】:

嗯,我找到了答案:

 LOCAL string[10] :DWORD
 lea edx, string
 invoke WriteConsoleA, handle, edx, stringlength, 0, 0

加载有效地址而不是偏移量有帮助!

【讨论】:

以上是关于C++中用writeconsole函数往控制台写字符串出现乱码,求救!的主要内容,如果未能解决你的问题,请参考以下文章

c++中用cout函数怎样实现格式输出

WriteConsole() 奇怪的字符?

如何使用 WinApi 的 WriteConsole 打印 LOCAL 字节

java graphics 往图片上写字 获取字符串的宽度 以像素为单位

C++大纲及疑惑点二

C++大纲及疑惑点二