WriteConsoleOutputCharacter Нарушение прав доступа

0

Я пытаюсь выполнить команду на 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? Любая помощь была бы высоко оценена,

Теги:
cmd

1 ответ

2
Лучший ответ

Параметр, который вы передаете cCharsWritten является параметром out, который функции заполняют при вызове. Вы должны передать указатель на DWORD. То, что вы проходите, является нулевым указателем.

Измените отклонение на:

DWORD cCharsWritten = 0;

А затем передайте его функциям в виде &cCharsWritten чтобы функции могли заполнять переменную количеством написанных символов.

Кроме того, убедитесь, что количество символов в ss равно количеству символов в dwConSize. Похоже, что указатель строки, который вы передаете, может не иметь длины, равной dwConSize. ss.length() этого используется ss.length().

  • 0
    Прежде всего, спасибо за ответ. На самом деле я уже попробовал то, что вы предложили, когда увидел определение WriteConsoleOutputCharacter (и я попробовал его еще раз только сейчас, чтобы убедиться), но результат точно такой же, исключение в той же самой точке.
  • 0
    Я добавил другое возможное решение.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню