Probleme mit der Funktion GetDlgItemText
-
Hallo, ich bin relativ in der WinApi Programmierung bzw. allgemein in der Programmierung.
Ich habe auch ein Problem mit VisualC++ 2005 und der Fkt. GetDlgItemText. Leider hat mir der eine Beitrag dazu nicht helfen können.
Also ich versuche nen Text, der in einer DialogBox eingegeben wird, mittels GetDlgItemText zu speichern. Leider klappt das nicht. Hier mal nen Code Ausschnitt:if(!GetDlgItemText(hPoDlg, IDC_PORT, szNameOfPort, lstrlen(szNameOfPort))) { dwError = GetLastError (); } EndDialog(hPoDlg, LOWORD(wParam)); //usw...Auf szNameOfPort soll die Eingabe hinterlegt werden. Ist global als LPWSTR deklariert und auch initialisiert.
Was mach ich da falsch, wenn ich szNameOfPort auslesen will bsplw. mitTextOut(hdc, 20, 20, szNameOfPort, lstrlen(szNameOfPort));(hdc usw.) sind alle korrekt registriert, habs mit nem verdefinierten string ausgetestet.
Hab das Gefühl, dass die Übergabe an den Pointer net richtig funzt oder wenn doch dass ich dann den Pointer net richtig aufrufe.
-
pibl schrieb:
if( !GetDlgItemText( hPoDlg, IDC_PORT, szNameOfPort, lstrlen( szNameOfPort ) ) ) { // ... }Der letzte Parameter sollte die Größe des zur Verfügung stehenden Speicherbereiches angeben, nicht die Länge der Zeichenkette, die dort gerade zufällig steht.
Greetz, Swordfish
-
if(!GetDlgItemText(hPoDlg, IDC_PORT, szNameOfPort, lstrlen(szNameOfPort)))lstrlen(szNameOfPort) ersetzen durch die Größe des Arrays...z.B.
TCHAR szNameOfPort[100]; if(!GetDlgItemText(hPoDlg, IDC_PORT, szNameOfPort, 100))
-
Airdamn schrieb:
TCHAR szNameOfPort[100]; if( !GetDlgItemText( hPoDlg, IDC_PORT, szNameOfPort, 100 ) )besser
GetDlgItemText( hPoDlg, IDC_PORT, szNameOfPort, sizeof( szNameOfPort ) / sizeof( TCHAR ) );um auf der sicheren Seite zu sein, falls sich die Größe von szNameOfPort 'mal ändert.
Greetz, Swordfish
-
Ich hab das eben mal geändert (danke für den Hinweis - gab da mehrere Version im Netz).
Aber leider liegt es nicht daran. Es ist als ob, einfach nichts auf dem dritten Parameter abgelgt wird.
-
Zeig bitte code.
Greetz, Swordfish
-
Zeig mal die Definition (bzw Deklaration) und die Initialisierung von szNameOfPort.
BTW: Was steht denn in dem C-String szNameOfPort nach dem Aufruf von GetDlgItemText (-> MessageBox(...))?
-
Swordfish schrieb:
Zeig bitte code.
Greetz, Swordfish
Deklaration von szNameOfPort:
LPWSTR szNameOfPort;Wie gesagt ich benutze VisualC++ 2005 Express. Da wird man von Microsoft gehalten, möglichst WideString zu benutzen. Alle Funktionen akzeptieren dann normalerweise nur WideStrings ausser man gibt ihnen direkt vor, dass Ansi benutzt werden soll.
szNameOfPort soll dann nach der Eingabe für den User mittels TextOut auf dem Bildschirm angezeigt werden und dann an die Funktion CreateFile() übergeben werden. In beiden Fällen klappt die Übergabe aber nicht. Wenn ich z.B. den WideString initialisiere etwa so:
LPWSTR szNameOfPort = TEXT("COM1");Dann übernimmt er den initialisierten Text "COM1". Aber ich will ja den Port auswählen können und nicht festlegen.
Die Eingabe mit GetDlgItemInt klappt übrigens problemlos. Deswegen vermute ich meinen Fehler bei der Übergabe an den Pointer.
Hier mal der vollständige Auszug aus der DialogBox:
INT_PTR CALLBACK EditPortBox (HWND hPoDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: SetDlgItemText (hPoDlg, IDC_PORT, szNameOfPort); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: if(!GetDlgItemText(hPoDlg, IDC_PORT, szNameOfPort, sizeof(szNameOfPort)/sizeof(TCHAR))) { dwError = GetLastError (); } EndDialog(hPoDlg, LOWORD(wParam)); break; case IDCANCEL: EndDialog(hPoDlg, LOWORD(wParam)); break; } return (INT_PTR)TRUE; break; } return (INT_PTR)FALSE; }Wie gesagt die Box funktioniert, bloss die Eingabe halt nicht.
-
mahc ma anstatt
LPWSTR szNameOfPart;wchar szNameOfPart[256];
deine version allokiert keinen soeicher sondern erzeugt einfach einen zeiger der irgendwohin zeigt und ncih dahin, wo man wirklich was schreiben darf.
-
Maxi schrieb:
mahc ma anstatt
LPWSTR szNameOfPart;wchar szNameOfPart[256];
deine version allokiert keinen soeicher sondern erzeugt einfach einen zeiger der irgendwohin zeigt und ncih dahin, wo man wirklich was schreiben darf.
Muy Grande!
Das funktioniert so wunderbar. Danke sehr!
Grüsse Pibl