String Buffer...
-
Hallo!
Ich habe eine wahrscheinlich sehr einfache Frage auf deren Lösung ich nicht komme...
Ich möchte einen String (char*) als buffer zwischen Einer Editbox und einer Message Box verwenden. Ich habe folgendes geschrieben:
. . . char *buffer; . . . buffer = new char; SendMessage(hwndEdit,EM_GETLINE,0, *buffer ); //Verlangt LPCSTR als buffer MessageBox (hwnd, buffer,szAppName, MB_OK | MB_ICONEXCLAMATION); delete buffer; . . .Anstatt des Textes das ich in der Editbox eingegeben habe erscheinen aber nur merkwürdige Zeichen (Speicheradresse?). Was mache ich falsch???
Bitte helft mir!
-
we wärs, wenn du uns deine Ausgabe mal zeigst?
hmm
mit buffer = new char;
legst du nur ein Char an (1 zeichen) und nicht ne Zeichenkette
-
Die Frage gehört eigentlich ins WinApi-Forum...
Die SenMessage kennt eigentlich Nachrichten, die mit WM anfagen (wie WindowMessage)...
Habe leider noch nicht sooo viel Ahnung damit...
-
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 );Und wie schon gesagt, ein paar Zeichen mehr sollte Buffer schon haben. 1 Zeichen dürfte schon etwas wenig sein, vor allem sollte der Inhalt des Speicherbereichs auf den buffer zeigt wohl nicht unbedingt leer sein.
Des Weiteren:
LPCSTR = char const *
LPSTR = char *
Und char const* kann ja ohne weiteres nen char* annehmen.Greetz
-
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);Allerdings musst du drauf achten, dass die zeichenkettenlänge die von SendMEssage komm nich größer als 511 ist, sonst wird in einen ungültigen bereich geschrieben.
Wenn du die Länge des Buffres weißt, mach es so:char* buffer=new char[Laenge];
Sendmessage, Messagebox
delete[] 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 castMaxi 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.
-
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.

GreetzDas 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.
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*)