c ++ - WriteConsole adgangsbrud i funktionsopkald, men ikke fra main ()

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at bruge WriteConsole (..) i et funktionsopkald, men jeg får adgangslovgivning. Når jeg kommenterer koden primært, udskriver den min tekst til skærmen uden problemer i hovedfunktionen. Når jeg forsøger at udskrive strengen i funktionsopkaldet, får jeg adgangskrænkelse, selvom det udskriver teksten til konsollen.


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
");
    }
}

Bedste reference


LPDWORD charsWriten;


LPDWORD er DWORD*. Så hvad du har der er en uninitialiseret pointer. Du sender så denne peger til WriteConsole, som skriver til den ugyldige placering, der peges på. I stedet erklærer charsWritten som type DWORD og sender adressen til WriteConsole med &charsWritten.


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


Hvis, som du siger, fungerer det som du har det i hovedet. Det er simpelthen uheld. Det er udefineret adfærd, som ikke altid har forudsigelige resultater.

Andre referencer 1


Denne erklæring er forkert:


LPDWORD charsWriten;


Funktionen CreateFile forventer, at den fjerde parameter er en peger på en variabel, den kan skrive ind. Du don't faktisk tildele hukommelse, selvom du bare erklære en pointer-en uninitialiseret en på det. Det vandt ikke arbejde. Du skal gøre:


DWORD charsWritten;

...

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


Det vil løse problemet med adgangsbrud, men det forklarer ikke hvorfor du skriver et tegn forbi slutningen af ​​din streng. Du behøver ikke tilføje 1 til strlen; den afsluttende NUL behøver ikke at blive skrevet.