在使用FillConsoleOutputAttribute函数时,写入位置时访问冲突

在学C语言控制台窗口图形界面编程,抄的https://blog.csdn.net/liluo_2951121599/article/details/66474233这里的代码。。

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>
using namespace std;
#define N 255

const WORD FORE_BLUE = FOREGROUND_BLUE;
const WORD FORE_GREEN = FOREGROUND_GREEN;
const WORD FORE_RED = FOREGROUND_RED;
const WORD FORE_PURPLE = FORE_BLUE | FORE_RED;
const WORD FORE_CYAN = FORE_BLUE | FORE_GREEN;
const WORD FORE_YELLOW = FORE_RED | FORE_GREEN;
const WORD FORE_GRAY = FOREGROUND_INTENSITY;
const WORD BACK_BLUE = BACKGROUND_BLUE;           
const WORD BACK_GREEN = BACKGROUND_GREEN;          
const WORD BACK_RED = BACKGROUND_RED;            
const WORD BACK_PURPLE = BACK_BLUE | BACK_RED;      //紫色
const WORD BACK_CYAN = BACK_BLUE | BACK_GREEN;    //青色
const WORD BACK_YELLOW = BACK_RED | BACK_GREEN;     
const WORD BACK_GRAY = BACKGROUND_INTENSITY;

int main()
{
    HANDLE handle_out;             //定义句柄
    CONSOLE_SCREEN_BUFFER_INFO screen_info;         //定义窗口缓冲区信息结构体
    const char* str = "Hello World!";
    int len = strlen(str), i;
    WORD shadow = BACKGROUND_INTENSITY;//也就是BACK_GRAY 灰色背景  //阴影属性
    WORD text = BACK_GREEN | BACK_GRAY;
    handle_out = GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleScreenBufferInfo(handle_out, &screen_info);
    SMALL_RECT rc;         //文本输出区域
    COORD posText;
    COORD posShadow;        //两个起始坐标
    //确定区域边界
    rc.Top = 8;
    rc.Bottom = rc.Top + 4;
    rc.Left = (screen_info.dwSize.X - len) / 2 - 2;   //可以让输出的字符串居中的左边界
    rc.Right = rc.Left + len + 4;
    //确定文本框起始坐标
    posText.X = rc.Left;
    posText.Y = rc.Top;
    //确定阴影框的起始坐标
    posShadow.X = posText.X + 1;
    posShadow.Y = posText.Y + 1;
    //输出阴影框
    LPDWORD a = NULL;
    for (i = 0;i < 5;++i)
    {
        FillConsoleOutputAttribute(handle_out, shadow, len + 4, posShadow, NULL);    //这里报错,但是其实尝试之后下面的fill也会报错
        posShadow.Y++;
    }
    //输出文本框
    for (i = 0; i < 5; ++i)
    {
        FillConsoleOutputAttribute(handle_out, text, len + 4, posText, NULL);
        posText.Y++;
    }
    //设置文本输出处的坐标
    posText.X = rc.Left + 2;
    posText.Y = rc.Top + 2;
    WriteConsoleOutputCharacter(handle_out, str, len, posText, NULL);
    SetConsoleTextAttribute(handle_out, screen_info.wAttributes);
    CloseHandle(handle_out);
    return 0;
}

其中str原文是使用char*来声明,但是我声明的时候会报错不知道为什么
加了const才正常

img


这里可以看到这个函数是运行完了才报错的
只运行了一次,没有进行下一个循环
代码都是照抄的啊。怎么会事呢

也尝试了换字符集,也没用
也尝试了抄另一个代码,只要有这个函数都报错。

console屏幕处理例子程序。终端窗口屏幕处理相关API使用例子。
来自MSVC20\SAMPLES\win32\console
http://download.csdn.net/detail/zhao4zhong1/3461309