c++ - WriteConsoleOutputCharacter 访问冲突

标签 c++ cmd

我一直在尝试在 cmd 上执行命令,并且我正在使用 WriteConsoleOutputCharacter。我的代码如下:

int main( void )
{
    HANDLE hStdout;
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);

    fun(hStdout,L"file1",L"file2");
    return 0;
}

void fun( HANDLE hConsole,wchar_t* str1,wchar_t* str2 )
{
   COORD coordScreen = { 0, 0 };    // home for the cursor 
   LPDWORD cCharsWritten=0;
   //LPDWORD cCharsWritten; that was originally
   CONSOLE_SCREEN_BUFFER_INFO csbi; 
   DWORD dwConSize;

   if( !GetConsoleScreenBufferInfo( hConsole, &csbi ))
   {
      return;
   }

   dwConSize = csbi.dwSize.X * csbi.dwSize.Y;

   std::wstring ss;
   ss=std::wstring(L"cp ")+ str1+std::wstring(L" ")+str2;


   if( !WriteConsoleOutputCharacter( hConsole,        // Handle to console screen buffer 
                                ss.c_str(),     // Character to write to the buffer
                                dwConSize,       // Number of cells to write 
                                coordScreen,     // Coordinates of first cell 
                                cCharsWritten ))// Receive number of characters written
   {
      return;
   }



   if( !GetConsoleScreenBufferInfo( hConsole, &csbi ))
   {
      return;
   }


   if( !FillConsoleOutputAttribute( hConsole,         // Handle to console screen buffer 
                                csbi.wAttributes, // Character attributes to use
                                dwConSize,        // Number of cells to set attribute 
                                coordScreen,      // Coordinates of first cell 
                                cCharsWritten )) // Receive number of characters written
   {
      return;
   }

   SetConsoleCursorPosition( hConsole, coordScreen );
}

代码编译正常,但首先我收到一条错误消息,说我在使用 cCharsWritten 时没有初始化它。所以我将它设置为 0 (LPDWORD cCharsWritten=0;)。但后来我不断收到

Unhandled exception at 0x772c5033 in CpProgrammatically.exe: 0xC0000005: Access violation reading location 0x00446000.

在调用 WriteConsoleOutputCharacter 的行。 我已经尝试了几乎所有我能想象的东西,但我无法弄清楚。我使用 cCharsWritten 变量的方式有问题吗?ss 是 unicode 字符串的事实有问题吗?任何帮助将不胜感激.

最佳答案

您将 cCharsWritten 传递给的参数是函数在调用时填充的输出参数。您假设传递一个指向 DWORD 的指针。您传递的是一个空指针。

将减速更改为:

DWORD cCharsWritten = 0;

然后将它作为 &cCharsWritten 传递给函数,这样函数就可以用写入的字符数填充变量。

此外,请确保 ss 中的字符数等于 dwConSize 中的字符数。看起来您传递的字符串指针的长度可能不等于 dwConSize。而是使用 ss.length()

关于c++ - WriteConsoleOutputCharacter 访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21383558/

相关文章:

windows - 命令脚本退出代码未被同一行 && 或 || 看到?

c++ - 如何仅构建和安装 boost 库的特定部分?

c++ - 当包含对象包含 unique_ptr 时如何删除 vector 的元素?

windows - 批量字符串问题(搜索整行)

python - 执行自定义命令以在 Windows 中运行 python 插件时出错

c++ - 在 C++ 中设置 Windows 系统时间

c++ - 窗口界面而不是 c 中的控制台

c++ - 使用扫掠 AABB 交叉算法解决碰撞法线

php exec 函数运行不正常

windows - 如何捕获从此菜单发送的 Windows 消息?