String Buffer...



  • 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



  • hmz... erst mal danke für eure hilfe 🙂

    leider funktioniert es immer noch nicht 😞

    Vellas schrieb:

    Statt buffer zu dereferenzieren solltest du buffer direkt als Parameter verwenden. Also statt

    SendMessage(hwndEdit,EM_GETLINE,0, *buffer );
    

    dies

    SendMessage(hwndEdit,EM_GETLINE,0, buffer );
    

    das hab ich überhaupt als 1. versucht... leider gibt das folgenden fehler:

    D:\Microsoft Visual C++\MyProjects\schule\client\steuerung.cpp(130) : error C2664: 'SendMessageA' : cannot convert parameter 4 from 'char [128]' to 'long'
            This conversion requires a reinterpret_cast, a C-style cast or function-style cast
    

    Maxi schrieb:

    Mach den buffer doch als stackvariable, buffer ist jetzt auch ein lpstr, lpcstr ist nur die konstante version davon, du hast gleich speicher reserviert und der wird automatisch freigegeben:

    char buffer[512];
    SendMessage(..., buffer);
    MessageBox(NULL, buffer, "", MB_OK);
    

    mit dieser variante ensteht exakt derselbe fehler oberhalb ... und wenn ich bei send message vors buffer wieder ein * setze komme ich zu dem selben resultat wie gaanz oben:

    eine messagebox mit IiiiiIiii 😞

    Maxi schrieb:

    Wenn du die Länge des Buffres weißt, mach es so:

    char* buffer=new char[Laenge];
    Sendmessage, Messagebox
    delete[] buffer;

    ja ich kann die länge des buffers mit

    iLength = SendMessage(hwndEdit,EM_LINELENGTH,0,0);
    

    ermitteln... ich habe es auch so versucht... ergebnis: IiiiIiii

    [quote="Vellas"]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. 🙂
    [quote]

    könntest du mir erklären wie ich das genau coden muss? 🙄

    sonst bin ich echt ratlos... 😞



  • std::string... Lies ein vernünftiges C++ Buch, da steht drin was std::string ist, da dies C++ Basiskenntnisse sind!

    Und wenn ich mir die Win32-API Dokumenation anschaue:

    LRESULT SendMessage( HWND hWnd,
    UINT Msg,
    WPARAM wParam,
    LPARAM lParam
    );

    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? Frag mal lieber im WinAPI-Forum nach, das hat mit ISO C++ herzlich wenig zutun.

    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.



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

    Und keine Ausreden von wegen: kann kein Englisch.
    1. Wie bitte?
    2. Wer ernsthaft C++ proggen will sollte auch Englisch lernen
    3. dann such halt die deutsche Fassung der MSDN.

    Laut Beschreibung in der MSDN muß der Code so aussehen:

    char tmp[256];
    DWORD* size = (DWORD*)tmp; // Im ersten Word des buffers steht die Länge des Buffers
    *size=256;
    SendMessage(hwnd, EM_GETLINE, (WPARAM)0, (LPARAM) tmp );
    

    Der Einfachheit halber kann man aber auch WM_GETTEXT nehmen, wenn es sich nur um ein ein-zeiliges Edit-Control handelt:

    char tmp[256];
    
    SendMessage(hwnd, WM_GETTEXT, (WPARAM)256, (LPARAM) tmp );
    

    jaja, ich weis, old skool casting, aber ich bin ja auch ein old skool progger... und genaugenommen ist die win API auch ne old skool Api 😉



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • 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