我一直在尝试在 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/