Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

18.06.2012, 00:44

[Gelöst] Automatisches löschen von WinApi Typen

Nabend ich bastel momentan wieder an meiner Window Klasse rum und wollte fragen ob es eine Möglichkeit gibt WinApi Typen(in meinem Fall LPSTR LPTSTR etc.) automatisch zu löschen. Ein kleines Beispiel wie ich das meine ist z.B. das hier:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    Window win;
    win.show();

    LPTSTR title = win.getText();
    MessageBox ( NULL, title, L"", MB_OK );
    delete title;

// Hier nochmal die getText Methode
    LPTSTR Window::getText()
    {
        if( m_Handle )
        {
            int textLength = GetWindowTextLength( m_Handle );

            if( textLength )
            {
                // To Match the \0
                textLength += 1;

                LPTSTR lpBuffer = new TCHAR[ textLength ];

                int success = GetWindowText( m_Handle, lpBuffer, textLength );

                if( !success )
                {
                    SAFE_DELETE(lpBuffer);
                    return NULL;
                }
                
                return lpBuffer;
            }
        }
        return NULL;
    }


So sieht es momentan aus aber nach möglichkeit hätte ich gerne das es so aussieht:

C-/C++-Quelltext

1
2
3
4
Window win;
    win.show();

    MessageBox ( NULL, win.getText(), L"", MB_OK );


Der Code so wie er oben steht funktioniert zwar erzeugt aber ein Memory Leak was natürlich nicht sehr schön ist, hoffe ihr könnt mir dann einen Tipp geben nach was ich suchen muss 8o
greate minds discuss ideas;
average minds discuss events;
small minds discuss people.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Sortoc« (18.06.2012, 13:58)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

18.06.2012, 02:59

Verwend (wenn möglich) doch einfach std::basic_string<TCHAR>!? Oder zumindest z.B. std::vector oder std::unique_ptr. LPTSTR ist nur ein typedef für TCHAR*...

3

18.06.2012, 13:57

Ah ok da ich nur string und wstring kannte und tstring nicht definiert ist habe ich gedacht das es so nicht funktioniert aber mit entsprechendem typedef funktioniert es doch danke für den Hinweis.

C-/C++-Quelltext

1
2
3
4
5
#ifdef UNICODE
namespace std { typedef wstring tstring; };
#else
namespace std { typedef string tstring; };
#endif
greate minds discuss ideas;
average minds discuss events;
small minds discuss people.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

18.06.2012, 15:51

Vielleicht ein kleiner Hinweis zu deiner Lösung: Genaugenommen ist es verboten, dem Namespace std neue typedef's hinzuzufügen, du solltest das also entweder einfach im globalen Namespace oder in einem eigenen Namespace definieren. Abgesehen davon, seh ich aber sowieso keinen besonderen Grund mehr, heutzutage überhaupt noch etwas anderes als Unicode zu unterstützen. Windows arbeitet intern auch mit Unicode, die ganzen ANSI WinAPI Funktionen sind unter der Haube nur Wrapper, die die übergebenen Strings in Wide Strings konvertieren und dann an die Unicode Implementierung weiterleiten. Ich würde also wohl einfach std::wstring zusammen mit den *W Varianten der WinAPI Funktionen (MessageBoxW(), GetWindowTextW() etc.) benutzen, den ganzen TCHAR, TEXT() usw. Kram vergessen und fertig...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (18.06.2012, 15:58)


Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

5

18.06.2012, 16:40

Dein SAFE_DELETE kannst du dir übrigens sparen ;)

delete lpBuffer; und fertig.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

18.06.2012, 16:54

Ja, oder noch besser: std::unique_ptr oder std::vector verwenden ;)

7

18.06.2012, 17:03

@dot:
Ja, oder noch besser: std::unique_ptr oder std::vector verwenden ;)
Verwend (wenn möglich) doch einfach std::basic_string!? Oder zumindest z.B. std::vector oder std::unique_ptr. LPTSTR ist nur ein typedef für TCHAR*...
Bitte nicht persönlich nehmen, aber du hast das schon geschrieben.

Mfg
Delop

8

19.06.2012, 01:14

Vielleicht ein kleiner Hinweis zu deiner Lösung: Genaugenommen ist es verboten, dem Namespace std neue typedef's hinzuzufügen

Das hab ich mir schon gedacht, ich fands nur doof überall nen std:: vorzumachen nur bei tstring dann nicht^^



Dein SAFE_DELETE kannst du dir übrigens sparen ;)

delete lpBuffer; und fertig.

Schon lustig das einem die Bücher immer Sachen vermitteln die anscheinend garnicht gebraucht werden und du hast natürlich recht ein einfaches delete würde ausreichen aber ist es den ein Performanceverlust SAFE_DELETE zu nehmen?


Ja, oder noch besser: std::unique_ptr oder std::vector verwenden ;)


Was denn nun? Soll ich wstring, unique_ptr oder vector verwenden? unique_ptr finde ich unhantlicher als wstring und wie das ganze mit vector laufen soll ist mir ein Rätsel. unique_ptr hab ich ja wenigstens noch zum laufen bekommen :D
greate minds discuss ideas;
average minds discuss events;
small minds discuss people.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

19.06.2012, 10:56


Dein SAFE_DELETE kannst du dir übrigens sparen ;)

delete lpBuffer; und fertig.

Schon lustig das einem die Bücher immer Sachen vermitteln die anscheinend garnicht gebraucht werden und du hast natürlich recht ein einfaches delete würde ausreichen aber ist es den ein Performanceverlust SAFE_DELETE zu nehmen?

Hängt wohl stark davon ab, was für Bücher man liest ;)
Der Performanceverlust wird in der Regel wohl völlig irrelevant sein. Trotzdem ist es einfach nicht notwendig. Warum etwas tun, das nichts bringt?

Ja, oder noch besser: std::unique_ptr oder std::vector verwenden ;)


Was denn nun? Soll ich wstring, unique_ptr oder vector verwenden? unique_ptr finde ich unhantlicher als wstring und wie das ganze mit vector laufen soll ist mir ein Rätsel. unique_ptr hab ich ja wenigstens noch zum laufen bekommen :D

Hängt davon ab. Für normales Stringhandling nimm std::wstring. std::unique_ptr bzw. std::vector für so Dinge, wo du eben einen dynamischen Buffer brauchst, z.B. um ein Ergebnis aufzunehmen...

Werbeanzeige