[英]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.