String Buffer...



  • Wow, ist das ein Schwachsinns-Thread... 😡 !

    Maxi schrieb:

    Mach den buffer doch als stackvariable, buffer ist jetzt auch ein lpstr, lpcstr ist nur die konstante version davon

    Das Ding heißt statisches Array.

    Vellas schrieb:

    Achja, noch einfacher wäre es natürlich std::string zu nehmen und sich dann mit der Funktion c_str() einen char const* zurückgeben zu lassen. 🙂
    Greetz

    Das bringt Dir hier rein gar nichts, da die WinAPI C-basiert ist und Du keinen direkten Zugriff auf den Speicherbereich des std::string's hast (du brauchst ja einen C-String), außer const_cast von c_str() und das ist tötlich 👎 .

    Artchi schrieb:

    [...]
    Msg ist vom Typ UINT. Bist du dir sicher, das man dem einen String oder Stringadresse übergibt? 😕 (bin kein Win32-API-Kenner...) Nicht eher einfach nur einen Zahlenwert, der eine Bedeutung hat? [...]

    Ein unsigned int ist -wie long- unter Windows 32 Bit, genau wie die Speicheraddressen, deswegen kannst Du das über einen reinterpret_cast<>() bzw. einen C-Cast () übergeben (also die Addresse).

    Artchi schrieb:

    Für eine MessageBox bring ich mal ein std::string-Beispiel... ist ja hier echt ein Trauerspiel:

    #include <string>
    #include <Windows.h>
    
    int main()
    {
      // ASCII String:
      std::string text = "Hallo, das ist ein C++ String!";
      MessageBox(NULL, text.c_str(), "Test", MB_OK | MB_ICONEXCLAMATION);
    
      // Unicode String
      std::wstring text2 = L"C++ String Unicode Arabisch: \u0623\u0645\u0646";
      MessageBoxW(NULL, text2.c_str(), L"Unicode", MB_OK | MB_ICONEXCLAMATION);
    
    }
    

    Vergiss den ganzen char-Pointer-Kram. Macht alles nur komplizierter als nötig. Lern C++ Basics und dein Leben als Coder wird einfacher.

    Mit dem Beispiel hast Du zwar Recht und std::string's sind wesentlich besser (und einfacher zu handhaben) als C-Strings ABER die WinAPI ist immer noch C-basiert, sodass man in vielen Fällen Probleme mit dem Zusammenspiel hat, ein gutes Beispiel dafür ist das (Anfangs-)Thema dieses Threads 😉 .

    Also so sollte das aussehen:

    // Header:
    #include <Windows.h>
    
    long lTextLength = SendMessage(hWndEdit, WM_GETTEXTLENGTH, 0, 0L);
    if(lTextLength)
    {
        PTCHAR pszBuffer = new TCHAR[lTextLength + 1];
        SendMessage(hWndEdit, WM_GETTEXT, lTextLength + 1, reinterpret_cast<LPARAM>(pszBuffer));
        MessageBox(NULL, pszBuffer, TEXT("Inhalt des Edit-Controls:"), MB_OK);
        delete [] pszBuffer;
    }
    


  • CodeFinder schrieb:

    Also so sollte das aussehen ...

    ist auch zu kompliziert. brauchst keine kopierorgie zu machen. man kann auch direkt auf den speicher des edit-controls zugreifen: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/editcontrols/editcontrolreference/editcontrolmessages/em_gethandle.asp



  • ten schrieb:

    CodeFinder schrieb:

    Also so sollte das aussehen ...

    ist auch zu kompliziert. brauchst keine kopierorgie zu machen. man kann auch direkt auf den speicher des edit-controls zugreifen: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/editcontrols/editcontrolreference/editcontrolmessages/em_gethandle.asp

    Jaja...dazu sag ich jetzt mal nix...



  • CodeFinder schrieb:

    Jaja...dazu sag ich jetzt mal nix...

    wieso? geht's nicht?
    :xmas2:



  • ten schrieb:

    CodeFinder schrieb:

    Jaja...dazu sag ich jetzt mal nix...

    wieso? geht's nicht?
    :xmas2:

    MSDN schrieb:

    If the function succeeds, the application can access the contents of the edit control by casting the return value to HLOCAL and passing it to LocalLock. LocalLock returns a pointer to a buffer that is a null-terminated array of CHARs or WCHARs, depending on whether an ANSI or Unicode function created the control.

    Bääääääääääääh.
    Pfui Deibel 😞
    *schüttel*

    p.S.: schonmal dass ich wissen muss wie das dumme Control angelegt wurde... das kann ich garnicht wissen es sei denn ich selber lege das an. *schauder* *nochmal-schüttel*



  • hustbaer schrieb:

    MSDN schrieb:

    If the function succeeds, the application can access the contents of the edit control by casting the return value to HLOCAL and passing it to LocalLock. LocalLock returns a pointer to a buffer that is a null-terminated array of CHARs or WCHARs, depending on whether an ANSI or Unicode function created the control.

    Bääääääääääääh.
    Pfui Deibel 😞
    *schüttel*

    aha, unüberwindliche hindernisse tun sich auf... 🙄
    konnt' ja nicht ahnen dass ihr damit überfordert seid.
    :xmas2:



  • ROFL Also erstmal thx @hustbear genau das meinte ich (u.a.). Des weiteren musst Du auch da ne Menge kopieren, wenn Du mit dem Text arbeiten willst (id est: ihn
    verändern willst).

    MSDN schrieb:

    The application may not change the contents of the buffer.

    Quelle: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/editcontrols/editcontrolreference/editcontrolmessages/em_gethandle.asp

    ten schrieb:

    hustbaer schrieb:

    MSDN zu EM_GETHANDLE schrieb:

    If the function succeeds, the application can access the contents of the edit control by casting the return value to HLOCAL and passing it to LocalLock. LocalLock returns a pointer to a buffer that is a null-terminated array of CHARs or WCHARs, depending on whether an ANSI or Unicode function created the control.

    Bääääääääääääh.
    Pfui Deibel 😞
    *schüttel*

    aha, unüberwindliche hindernisse tun sich auf... 🙄
    konnt' ja nicht ahnen dass ihr damit überfordert seid.
    :xmas2:

    Wenn Du Dich in der Lage siehst, kannst Du das ja so machen, ich glaube jeder andere ist mit meinem vorherigen Vorschlag besser beraten.

    PS: MS rät indirekt sogar von der Verwendung ab:

    MSDN zu EM_GETHANDLE schrieb:

    If your application cannot abide by the restrictions imposed by EM_GETHANDLE, use the GetWindowTextLength and GetWindowText functions to copy the contents of the edit control into an application-provided buffer.



  • IsWindowUnicode



  • CodeFinder schrieb:

    ROFL Also erstmal thx @hustbear genau das meinte ich (u.a.).

    hehe, hinterher kann das jeder sagen 🙂

    CodeFinder schrieb:

    Des weiteren musst Du auch da ne Menge kopieren, wenn Du mit dem Text arbeiten willst (id est: ihn verändern willst).

    falls es dir noch nicht aufgefallen ist: wir wollen den text nicht verändern, sondern ihn nur mit 'ner messagebox ausgeben...
    :xmas2:



  • @OP: Die Nachrichten für ein Edit-Control und für ein Rich-Edit-Control fangen beide mit EM_ an. EM_GETLINE ist eine Nachricht für ein Rich-Edit-Control und deine Editbox kann deshalb nichts damit anfangen.
    Du musst da unbedingt unterscheiden, Rich-Edit und Edit sind was anderes.



  • ten schrieb:

    hehe, hinterher kann das jeder sagen 🙂

    Und warum hätte ich dann Deiner Meinung nach überhaupt gepostet, wenn ich keinen Hintergedanken dabei hätte ? Ab einem bestimmen Zeitpunkt setzt der menschliche Körper s.g. Schlafhormone frei die im Allgemeinen für Müdigkeit sorgen 😃 . Wenn das bei Dir nicht der Fall ist, würde ich mir Gedanken machen 😃 ... (Ich hoffe Du weißt worauf sich diese Aussagen beziehen *grinz*)


Anmelden zum Antworten