[英]WriteConsole access violation in function call but not from main()
我试图在函数调用中使用WriteConsole(..),但遇到访问冲突。 当我取消注释main中的代码时,它将我的文本打印到屏幕上,而main函数没有问题。 当我尝试在函数调用中打印字符串时,即使确实将文本打印到控制台,也会出现访问冲突。
void print(char *_charArray);
int _tmain(int argc, _TCHAR* argv[])
{
HWND hConsole;
// HANDLE hFile;
char myText[] = "This is my text";
char *pMyText = myText;
LPDWORD charsWriten;
// hFile = CreateFile("CONOUT$", GENERIC_WRITE, FILE_SHARE_READ, NULL,
// OPEN_EXISTING, 0, NULL);
print(pMyText);
// WriteConsole(hFile, myText, sizeof(myText), charsWriten, NULL);
getch();
return 0;
}
void print(char *text)
{
LPDWORD charsWriten;
HANDLE hFile;
hFile = CreateFile("CONOUT$", GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE | FILE_SHARE_READ, NULL,
OPEN_EXISTING, 0, NULL);
unsigned int strn = strlen(text) + 1;
if(!WriteConsole(hFile, text, (strlen(text) + 1), charsWriten,NULL))
{
printf("Write Failed\n");
}
}
该声明是错误的:
LPDWORD charsWriten;
CreateFile
函数期望第四个参数是指向它可以写入的变量的指针。 但是,您实际上并没有分配内存。 您只需声明一个指针-就是一个未初始化的指针。 那行不通。 您需要做:
DWORD charsWritten;
...
WriteConsole(hFile, text, (strlen(text) + 1), &charsWritten, NULL)
这将解决访问冲突问题,但不能解释为什么您要在字符串末尾写入一个字符。 您不需要在strlen
上加1; 不需要编写终止的NUL。
LPDWORD charsWriten;
LPDWORD
是DWORD*
。 因此,您所拥有的是一个未初始化的指针。 然后,您将此指针传递给WriteConsole
,该指针将写入指向的无效位置。 而是将charsWritten
声明为DWORD
类型,并使用&charsWritten
将其地址传递给WriteConsole
。
DWORD charsWritten;
WriteConsole(hFile, text, (strlen(text) + 1), &charsWritten, NULL);
如您所说,如果它像您主要的那样工作。 那简直是倒霉。 这是不确定的行为,并不总是可以预期的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.