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

03.05.2012, 17:38

std:string to LPCWSTR (SetDlgItemText)

Hallo Community,

da ich in Google nicht sehr viel gefunden habe, was mich weiter bringt habe ich
mich hier angemeldet um euch zwei Fragen zu stellen.



Die erste lautet wie der Titel beschreibt:

Wie kann ich einen std:string, den ich von einer Funktion zurückgeben lasse in
LPCWSTR umwandeln um diesen per SetDlgItemText in ein Edit Feld (DialogBox per
Ressource) anzeigen zu lassen? Zur Info: Ich verwende Visual Studio (VC++) und
Unicode.



C-/C++-Quelltext

1
2
3
4
5
string Name = Funktion(...);

//Konvertierung

SetDlgItemText( hWnd, IDC_NAME, Name);




Meine zweite Frage hat nicht all zu viel mit der Überschrift zu tun, allerdings
wollte ich keine zwei Themen öffnen. :)

Ich habe eine eigene Update Funktion in mein Programm eingebaut, sodass sich
diese "updatet" sofern eine neue Version verfügbar ist.

Allerdings funktioniert dies nicht ganz so wie ich das möchte...



Die Theorie ist einfach.

Es wird im Internet(Webspace) eine .txt Datei überprüft, in der nur die
Version(1) angegeben ist. Wenn die Version gleich der gespeicherten Version in
meinem Programm ist(1) startet dies automatisch. Ist der Wert höher, so wird
die neue Version runtergeladen, die sich im Gleichen Verzeichnis wie die .txt
befindet.



Programmiertechnisch habe ich dies so verwirklicht:

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
    HINTERNET hInternet, hOpenUrl;

    

    if ((hInternet = InternetOpen(L"Register",
INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0)) != NULL) {

        if ((hOpenUrl =
InternetOpenUrl(hInternet,
L"http://infemo.in.funpic.de/Multihack%20by%20Scarface/Update.txt",
NULL, 0, 0 ,0)) != NULL) {

            char   
*buffer = new char[10000];

           
DWORD   bytesRead;



            if
(InternetReadFile(hOpenUrl, buffer, 10000, &bytesRead) == TRUE) {

               
buffer[bytesRead] = 0;

               
//Testausgabe

               
//cout << buffer << endl;

               
//getchar();

               
 if(buffer == "1")

                {

               
    MessageBoxW(0, L"Kein Update verfügbar!",
L"Info", MB_ICONINFORMATION);

                }

               
else

                {

               
    MessageBoxW(0, L"Update verfügbar!",
L"Info", MB_ICONINFORMATION);

                }



                

               
InternetCloseHandle(hOpenUrl);

            }

        }

        InternetCloseHandle(hInternet);

    }


Die Testausgabe gibt immer das richtige aus. Also wird die Datei richtig
gelesen. Allerdings kommt nur einmal am Anfang die richtige Meldung(Update/kein
Update). Wenn ich den Wert verändert habe wird der Richtige ausgegeben,
allerdings wird bei der If-Abfrage trotzdem die gleiche Meldung wie am Anfang
ausgegeben.

Habe die Vermutung, das das irgendwie im Cache o.ä. gespeichert wird oder
sowas, kann das sein?

Würde mich sehr über Hilfestellung freuen!



Mit freundlichen Grüßen

Infemo

Oberon

Treue Seele

Beiträge: 181

Wohnort: Österreich

Beruf: Student

  • Private Nachricht senden

3

03.05.2012, 17:57

Zuerst muss man wissen, was sich hinter LPCWSTR versteckt: Long Pointer Const Wide STRing ist ein einfaches const wchar_t*. Wenn du std::wstring statt std::string verwendest, kannst du einfach die c_str() Methode aufrufen, beim "normalen" std::string hat die aber einen const char* statt const wchar_t* Rückgabetyp, c_str allein reicht hier also nicht (auch @.:!Batzer!:.). Zum Konvertieren kannst du mbstowcs verwenden. Alternativ kannst du auch SetDlgItemTextA verwenden, diese Funktion nimmt einen const char* (LPCSTR).

4

03.05.2012, 17:57

Statt eines strings einen wstring benutzen.
Das sollte ausreichend helfen. ;)
Meine eigene Lösung wäre es gewesen einen wstring anzulegen mit dem Inhalt deines/meines strings.

MfG
Check

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

03.05.2012, 18:21

Einfachste Lösung, wenn du nichts mit Unicode zu tun haben willst:
SetDlgItemTextA(... deinString.c_str() ...) benutzen (beachte das A in SetDlgItemTextA), das ist die Nicht-Unicode-Version der Funktion.

6

03.05.2012, 19:09

[...]Zur Info: Ich verwende Visual Studio (VC++) und
Unicode.[...]

;)

MfG
Check

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

03.05.2012, 19:21

[...]Zur Info: Ich verwende Visual Studio (VC++) und
Unicode.[...]

;)

MfG
Check

Na und?
Scheinbar benutzt er es aber nicht durchgängig, sonst hätte er doch das Problem gar nicht, dass er einen std::string hat und keinen wstring.
Man kann das doch problemlos mischen. Wenn die Daten kein Unicode sind, finde ich es sinnlos sie zuerst nach Unicode zu konvertieren, wenn man genausogut eine Nicht-Unicode-Variante der WinAPI-Funktion benutzen kann. Dann wird es zwar intern vom OS auch konvertiert, aber da muss ich mir nicht die Arbeit machen.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

03.05.2012, 19:22

Das ist wie, "Aber ich benutze DirectX11";)
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

9

03.05.2012, 23:07

In deinem Code ist übrigens ein potentieller Bufferoverflow drin. Außerdem sollte man in C/C++ nie auf Gleichheit mit true prüfen. Lass das ==TRUE einfach weg.

Dein eigentliches Problem rührt wohl daher, dass das erste Zeichen der Datei wohl nicht die Ziffer ist, sondern irgendein Header oder BOM oder sonstwas. Durchsuch die Datei einfach nach der ersten Ziffer.
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

04.05.2012, 01:35

Außerdem sollte man in C/C++ nie auf Gleichheit mit true prüfen. Lass das ==TRUE einfach weg.

Wieso denn das?

Werbeanzeige