CString.GetBuffer() Problem



  • Ich hab 2 class members
    1. CStringA m_cstringa;
    2. char m_char_buffer[100];

    Nun muss ich immer wieder chars_to_copy von m_char_buffer nach m_cstringa kopieren:

    LPSTR pb = m_cstringa.GetBuffer( chars_to_copy+1 );
    errno_t err = strncpy_s( pb, chars_to_copy+1, m_char_buffer, chars_to_copy );
    //pb[chars_to_copy] = '\0';
    //m_cstringa.ReleaseBuffer( -1 );
    m_cstringa.ReleaseBuffer();
    

    Weder der auskommentierte code noch ReleaseBuffer(); funktionieren zuverlässig.
    // err ist übrigens ok

    int len = m_cstringa.GetLength();
    

    ergibt die korrekte Länge, aber manchmal ist m_cstringa trotzdem leer, manchmal nicht. Das ist das Problem.

    Was läuft da falsch?

    Danke.



  • Du weißt schon, daß der Puffer, nach "ReleaseBuffer()", seine Gültigkeit verliert 😕

    // example for CString::ReleaseBuffer
    CString s;
    s = "abc";
    LPTSTR p = s.GetBuffer( 1024 );
    strcpy(p, "abc");   // use the buffer directly
    ASSERT( s.GetLength() == 3 ); // String length = 3
    s.ReleaseBuffer();  // Surplus memory released, p is now invalid.
    ASSERT( s.GetLength() == 3 ); // Length still 3
    


  • Exhumed schrieb:

    Du weißt schon, daß der Puffer, nach "ReleaseBuffer()", seine Gültigkeit verliert 😕

    Klar ich will ja danach nicht den buffer weiterbenutzen nur cstringa.

    Ich will nur nach CStringA m_cstringa; einen Inhalt aus einem char-array/char-pointer (je nachdem) kopieren.

    Alle member-variablen werden immer wieder zurückgesetzt und dann irgendeine Anzahl von bytes kopiert.



  • EOP schrieb:

    Exhumed schrieb:

    Du weißt schon, daß der Puffer, nach "ReleaseBuffer()", seine Gültigkeit verliert 😕

    Klar ich will ja danach nicht den buffer weiterbenutzen nur cstringa.

    Hab ich mir auch gedacht 😉
    Ich habe versucht den Code zu reproduzieren. Bei mir funktioniert es. Verwende aber nur "strncpy", weil ich noch Visual C++ 6.0 benutze. *schäm*.


Anmelden zum Antworten