Frage zu .NET



  • Hallo alle zusammen!

    Sollte dieser Beitrag im falschen Forum gelandet sein => bitte verschieben.

    Ich bin unlängst auf c++ .net umgestiegen und kann jetzt eigentlich nicht mehr debuggen. Debuggen würde schon funktionieren, überall wo ich aber einen Thread erstelle, bekomme ich folgende Messagebox:

    Run-Time Check Failure #2 - Stack around the variable 'lpszRootPathName' was corrupted.
    Break - Continue - Ignore(disabled) - Help

    Unter Visualt Studio 6 hatte ich diese Fehlermeldung nie. Ist das wirklich ein Fehler (mit Continue kann ich ja problemlos weitermachen beim Debuggen), oder nur ein Warning???

    Die meldung ist echt mühsam, denn zum Kopieren einer File erstelle ich einen neuen Thread und wenn ich jetzt einen Fehler bei File#235 habe, muss ich erst 234 mal Continue klicken und das nervt.....

    Die meldung kommt aber nicht nur bei Threads. Ich rufe auch eine inline void funktion von OnInitDialog aus auf und da kommt sie auch....



  • Zeig doch mal bissel Beispielcode!
    P.S. Die Errorcheck-Funktion wurde bei .NET stark verbessert, möglicherweise ist der Fehler auch in VC6 schon vorhanden!



  • Diese Funktion wird von OnInitDialog() aufgerufen. Der Fehler kommt ganz am Ende, wenn er wieder bei OnInitDialog weiter machen sollte. Da das ja eine inline Funktion ist, sollte er bei der Code-generierung den Funktions-Code an den Ort des aufrufes setzen....

    inline void CDataMigDlg::InsertDrives()
    {
        char            lpszRootPathName[3];
        static LPTSTR   lpDriveStrings = NULL;
        unsigned int    DriveType, ListCount;
        DWORD           dwCount, dwDriveMask;
    
        dwCount=GetLogicalDriveStrings( 0, lpDriveStrings);
        dwDriveMask=GetLogicalDrives();
        memset(lpszRootPathName,'a',3);
        lpszRootPathName[3]='\x0';
    
        for (unsigned int i=97; i<123; i++){ //From ASCII 0x61 ('a' || 97) to 0x7B ('z' || 123)
            if (dwDriveMask & 1) {
    
                sprintf(lpszRootPathName,"%c:\\",(char) i);
                lpszRootPathName[3]='\x0';
    
                DriveType = GetDriveType(lpszRootPathName);
                if (DriveType == DRIVE_REMOTE) {
                    SendDlgItemMessage(IDC_LIST_DESTINATION,LB_ADDSTRING, NULL, (LPARAM) (LPCTSTR) lpszRootPathName);
                }
    
                if (DriveType == DRIVE_FIXED) {
                    SendDlgItemMessage(IDC_LIST_SOURCE,LB_ADDSTRING, NULL, (LPARAM) (LPCTSTR) lpszRootPathName);
                }   
    
            }
    
            dwDriveMask >>= 1;
        }
    
        ListCount = (unsigned int)SendDlgItemMessage(IDC_LIST_DESTINATION,LB_GETCOUNT, NULL, NULL);
    
        if(!ListCount) {
            MessageBox("No network drives mounted!","Error",MB_OK);
            exit(1);
        }
    }
    


  • Fehler schon gefunden:

    !!! Schau Dir mal lpszRootPathName an !!!



  • char            lpszRootPathName[4];
    static LPTSTR   lpDriveStrings = NULL;
    unsigned int    DriveType, ListCount;
    DWORD           dwCount, dwDriveMask;
    
    dwCount=GetLogicalDriveStrings( 0, lpDriveStrings);
    dwDriveMask=GetLogicalDrives();
    lpszRootPathName[4]='\x0';
    

    könnte die Lösung sein.



  • @MaSTaH

    Genauso falsch!!!

    lpszRootPathName[4] gibts doch gar net !! man man man *kopfschüttel*



  • Benutzt CString anstelle char-Arrays, da müßt ihr euch nicht so quälen lassen. 😉



  • @René G

    Achso du Superprofi. Und warum soll es das nicht geben???

    lpszRootPathName[4] gibts doch gar net !! man man man *kopfschüttel*

    lpszRootPathName[4]='\x0'; war bei mir falsch. Kann ja mal passieren
    Es muss natürlich ne drei sein. aber oben beim deklarieren muss auf jeden Fall ne 4 hin. man man man. dein beitrag war auch klasse.

    guck dir mal lpszRootPathName an. super beitrag



  • @MaSTaH

    Sicher war mein Beitrag klasse, schliesslich soll man hier was lernen und das vor allem aus Eigenen Erkenntnissen mit Hinweisen unsererseits.

    ??? Was solls denn, wenn wir alles vorsagen ??? Ich möchte doch nur ein bisschen zum Denken anregen! Oder ist wirklich das genauere Hinschauen auf 4 Zeilen Code zuviel verlangt?

    Wenn wirs genau nehmen, hätte ich ja den Beitrag auch nach AnsiC verschieben müssen, da es sich nicht um ein MFC und auch nicht um ein API-Problem handelt!


Anmelden zum Antworten