String Buffer...
-
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*)