簡體   English   中英

函數調用中存在WriteConsole訪問沖突,但不是來自main()

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

LPDWORDDWORD* 因此,您所擁有的是一個未初始化的指針。 然后,您將此指針傳遞給WriteConsole ,該指針將寫入指向的無效位置。 而是將charsWritten聲明為DWORD類型,並使用&charsWritten將其地址傳遞給WriteConsole

DWORD charsWritten;
WriteConsole(hFile, text, (strlen(text) + 1), &charsWritten, NULL);

如您所說,如果它像您主要的那樣工作。 那簡直是倒霉。 這是不確定的行為,並不總是可以預期的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM