Я пытаюсь выполнить команду на 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
является параметром out, который функции заполняют при вызове. Вы должны передать указатель на DWORD
. То, что вы проходите, является нулевым указателем.
Измените отклонение на:
DWORD cCharsWritten = 0;
А затем передайте его функциям в виде &cCharsWritten
чтобы функции могли заполнять переменную количеством написанных символов.
Кроме того, убедитесь, что количество символов в ss
равно количеству символов в dwConSize
. Похоже, что указатель строки, который вы передаете, может не иметь длины, равной dwConSize
. ss.length()
этого используется ss.length()
.