C++ WriteConsoleOutputCharacter访问冲突

C++ WriteConsoleOutputCharacter访问冲突,c++,cmd,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* str

我一直试图在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 );
}
代码编译得很好,但首先我收到一个错误,说我在使用CCharsWrite时没有初始化它。因此我将它设置为0(LPDWORD ccharsWrite=0;),但随后我继续得到

Unhandled exception at 0x772c5033 in CpProgrammatically.exe: 0xC0000005: Access violation reading location 0x00446000.
在调用WriteConsoleOutputCharacter的行中。
我尝试了几乎所有我能想象到的东西,但我无法理解。我使用CCHARSWRITED变量的方式是否有问题?ss是unicode字符串的事实是否有问题?非常感谢提供任何帮助。

您传递给
CCHARSWRITED
的参数是函数填充的out参数打电话的时候。假设您传递一个指向
DWORD
的指针。您传递的是一个空指针

将减容更改为:

DWORD cCharsWritten = 0;
然后将其作为
&ccharsWrited
传递给函数,以便函数可以使用写入的字符数填充变量


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

首先感谢您的回答。事实上,我已经尝试了您在看到WriteConsoleOutputCharacter定义时提出的建议(我刚才又尝试了一次以确保)但结果是完全相同的,在同一点上出现了一个异常。我添加了另一个可能的解决方案。Tyrns out dwConSize是您建议的问题。我使用(DWORD)ss.length()作为参数,而不是它,以确保长度没有问题,并且一切正常。如果您愿意,请将此添加到您的答案中,并感谢您的帮助!