Studium, Ausbildung und Beruf
 StudiumHome   FAQFAQ   RegelnRegeln   SuchenSuchen    RegistrierenRegistrieren   LoginLogin

Windowsprogrammierung
Neues Thema eröffnen   Neue Antwort erstellen
Foren-Übersicht -> Informatik-Forum -> Windowsprogrammierung
 
Autor Nachricht
farnold
Full Member
Benutzer-Profile anzeigen
Full Member


Anmeldungsdatum: 28.09.2008
Beiträge: 219

BeitragVerfasst am: 14 März 2012 - 01:47:41    Titel: Windowsprogrammierung

Hallo,

ich will mit meinem Programm lediglich Klassennamen und Windowsnamen des Texteditors ausgeben.
Der folgende Quelltext funktioniert auch wunderbar.

Wenn ich jedoch

GetWindowText(hwnd, winName, 255);
std::cout << winName << std::endl;

in


GetWindowText(hwnd, winClass, 255);
std::cout << winClass << std::endl;

ändere bekomme ich einen segfault.

Warum darf ich die Variable winClass nicht verwenden, bzw. warum bekomme ich da einen Segfault?


Hier der gesamte Quellcode:

Code:

#include <windows.h>
#include <iostream.h>

int main(){
    HWND hwnd;
    DWORD ID;
    DWORD rw = 0;
    HANDLE handle;
   
    LPSTR winName;
    LPSTR winClass;
   
    hwnd = FindWindow(NULL,"Unbekannt - Editor");
    if(!hwnd)
        std::cout << "Failed to open Window" << std::endl;


    GetClassName(hwnd, winName, 255);
    std::cout << winName << std::endl;
   
    GetWindowText(hwnd, winName, 255);
    std::cout << winName << std::endl;
   
    return 0;
}


viele Grüße,
fa
Jockelx
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 24.06.2005
Beiträge: 3596

BeitragVerfasst am: 15 März 2012 - 16:32:29    Titel:

Du verwendest winName statt winClass in GetClassName.
farnold
Full Member
Benutzer-Profile anzeigen
Full Member


Anmeldungsdatum: 28.09.2008
Beiträge: 219

BeitragVerfasst am: 15 März 2012 - 16:35:46    Titel:

ja, weil wenn ich winClass in GetClassName verwende bekomme ich komischerweise einen segfault, weiß aber nicht warum Sad
Jockelx
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 24.06.2005
Beiträge: 3596

BeitragVerfasst am: 16 März 2012 - 15:17:02    Titel:

Ok, ich verstehe gerade gar nicht, warum das überhaupt irgendwie funktioniert.
Du musst doch Speicher für den Rückgabestring reservieren.
Nimm doch mal statt dem LPSTR ein char[255].
farnold
Full Member
Benutzer-Profile anzeigen
Full Member


Anmeldungsdatum: 28.09.2008
Beiträge: 219

BeitragVerfasst am: 17 März 2012 - 00:45:01    Titel:

hmhmhm mit char[255] funktionierts.

aber die definition für GetClassName ist ja

Code:
int WINAPI GetClassName(
  __in   HWND hWnd,
  __out  LPTSTR lpClassName,
  __in   int nMaxCount
);


d.h. als 2. Argument wird einfach ein char* erwartet und die 3. variable gibt die buffergröße des 2. Arguments an.
Warum muss ich also schon im voraus sagen wie groß char ist?

ich mein ich kann ja auch schreiben:

Code:
char* test;
test = "Hallo";
bzw.
char* test = hallo;
IjonTichy
Junior Member
Benutzer-Profile anzeigen
Junior Member


Anmeldungsdatum: 06.06.2009
Beiträge: 86

BeitragVerfasst am: 18 März 2012 - 09:35:58    Titel:

Weil DU den Platz für die 255 zugesagten Zeichen bereitstellen musst. Denn die Funktion GetClassName() schreibt die Zeichen des gefundenen Klassennamen in den Speicher ab der mit winName angegebenen Adresse.

Code:
char* test;
test = "Hallo";
bzw.
char* test = "hallo";

Du solltest dir mal genau überlegen was obige Zeilen tun. Ich befürchte das du dir da was anderes vorstellst, als das was wirklich passiert. Wink
farnold
Full Member
Benutzer-Profile anzeigen
Full Member


Anmeldungsdatum: 28.09.2008
Beiträge: 219

BeitragVerfasst am: 18 März 2012 - 12:45:09    Titel:

Zitat:
Du solltest dir mal genau überlegen was obige Zeilen tun. Ich befürchte das du dir da was anderes vorstellst, als das was wirklich passiert.


das befürchte ich auch Smile

finde diese schreibweise sowieso komisch.
char* test; damit lege ich normal einen Pointer an, der auf einen Char zeigt.
also würde ich als zuweisung soetwas erwarten:
char* test = 0x0123;
aber man kann ihm warum auch immer eine Zeichenkette zuweisen, also:
char* test = "Dumdidum";
und wenn wir dies tun, haben wir - zumindest in der Vorlesung - vorher nie Speicher allokiert, sondern eben gleich char* test = "Dumdidum"; geschreiben.

In einem anderen Forum habe ich dann gefunden, dass

Code:
char* test;
test = "Hallo";
bzw.
char* test = "hallo";


jeweils den selben Assembler Code produziert.

Ich bin verwirrst Sad
IjonTichy
Junior Member
Benutzer-Profile anzeigen
Junior Member


Anmeldungsdatum: 06.06.2009
Beiträge: 86

BeitragVerfasst am: 18 März 2012 - 13:25:49    Titel:

Das ist richtig. Es geschieht folgendes:
- Es wird die Variable test vom Typ char* angelegt.
- Es wird durch den Compiler, nicht durch dich, ein konstantes String-Literal "hallo" angelegt.
- Deine Variable test erhält als Wert den Zeiger auf den Anfang dieses String-Literals, also &hallo[0].

Da du diesen String nicht allokiert hast, musst du ihn auch nicht freigeben, andererseits kann er aber auch nicht manipuliert werden, zumindest wenn du keinen Speicherfehler möchtest.
Manicopus
Junior Member
Benutzer-Profile anzeigen
Junior Member


Anmeldungsdatum: 09.09.2019
Beiträge: 64

BeitragVerfasst am: 13 Sep 2019 - 19:11:23    Titel:

Steuern sind immer noch die halbe Miete, viele wissen nicht, wie man einen Webshop erstellt. Ich kann Sie auf dieser Plattform beraten - https://de.supr.com/start/ . Billig und fröhlich.
Beiträge der letzten Zeit anzeigen:   
Foren-Übersicht -> Informatik-Forum -> Windowsprogrammierung
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

Chat :: Nachrichten:: Lexikon :: Bücher :: Impressum