Beim ersten Problem kann ich dir leider nicht helfen, da ich keine Ahnung habe was ein LPCWSTR sein soll. Es empfiehlt sich normalerweise die angebotene String-Klasse std::string oder die String-Klasse einer Library die man benutzt zu verwenden. Etwa mit dem QString von Qt kommt man schon extrem weit.
Zitat:
Das Zweite ist sicher einfach, in Delphi war eine solche struktur möglich:
Es gibt keine Properties in C++. Der übliche Weg ist Get- und Set-Methoden anzubieten.
Registriert: Di Okt 13, 2009 17:25 Beiträge: 365
Programmiersprache: C++
LPCWSTR (Long Pointer Character Wide-STRing) ist eine Erfindung von Microsoft und das gibt es auch nur, wenn du für Windows entwickelst. Im Prinzip ist es einfach ein Zeiger, der auf ein Array von je 2 Byte großen Unicode-Zeichen verweißt. Wahrscheinlich ist es irgendwo so deklariert:
Code:
#define LPCWSTR (unsigned short int*)
Das hat aber mit deinem Problem nichts zu tun. Dein Fehler liegt in Zeile 3. Du reservierst dort lokal Speicher, der automatisch wieder freigegeben wird, sobald die Funktion beendet wird. Der Zeiger, den du zurückgibst, verweist auf diesen Speicherberech, der sofort nach dem Ausführen der Funktion ungültig ist. Du müsstest den Speicher so reservieren:
Code:
WCHAR* str =NULL;
str =new WCHAR[256];
if(str ==NULL)
returnNULL;
Nach dem Funktionsaufruf nicht vergessen, den Speicher mit delete[] wieder freizugeben.
Edit: Dieser Code ist allerdings nicht allzu schön, da er von einer festen Stringlänge von 255 Zeichen ausgeht. Sobald der String kürzer ist, kracht es. Besser macht man es so (Dabei muss der String Null-terminiert sein, was er normalerweise ist):
Registriert: Di Okt 13, 2009 17:25 Beiträge: 365
Programmiersprache: C++
Edit: Leider warst du schneller, trotzdem zum Verständnis des Posts davor:
Dropye hat geschrieben:
ich hab jetzt den code erstmal so übernommen wie er ist aber wie soll ich den speicher dann wieder löschen? bzw welchen?
Zu jeden new gehört immer ein delete und zu jedem new [] ein delete[]. Also nehmen wir an, du benutzt die Funktion aus meinem letzten Post:
Code:
char* pAnsiStr ="ANSI braucht nur ein Byte pro Zeichen";
LPCWSTR pUnicodeStr = CharToLPCWSTR(pAnsiStr);
// irgendwas mit pUnicodeStr tun
delete[] pUnicodeStr;
pUnicodeStr =NULL;// Diese Zeile ist nicht zwingend noetig, beugt aber Fehlern vor
Der Speicher, auf den pUnicodeStr zeigt, wird in der Funktion CharToLPCWSTR reserviert (mit new []). Dieser wird erst dann wieder freigegeben, wenn du delete[] pUnicodeStr; aufrufst.
Coolcat hat aber Recht, normalerweise arbeitet man meistens nicht mit solchen Basistypen, sondern mit Klassen, die einem einiges an Arbeit abnehmen (Ist ja in Delphi nicht anders). Insbesondere von solchen Herstellerspezifischen Typen wie LPCWSTR würde ich die Finger lassen, weil es nicht nur scheußlich aussieht, sondern auch nicht portabel ist. Für das Verstehen von Pointern kann man aber eigentlich nichts besseres tun, als ein wenig "Handarbeit" anzulegen (also nicht alles von fertigen Klassen machen lassen).
wenn ich es nicht müsste würde ich es nicht nutzen aber es gibt nunmal keine mir bekannt alternative zu "CreateWindowEx" welche mir ja mein benötigtes Fenster erstellt damit ich was sehe und die will nunmal einen parameter in dieser form
Registriert: Di Okt 13, 2009 17:25 Beiträge: 365
Programmiersprache: C++
Ich verstehe leider deinen letzten Post nicht. Vielleicht wunderst du dich, dass ich in abgekürzter Form geschrieben habe, mit den Kommentarzeichen /* */ und // ? So war das gemeint:
Code:
hWnd = CreateWindowEx(dwExStyle,
wc.lpszClassName,
ToLPCWSTR(title),
WS_CLIPSIBLINGS|WS_CLIPCHILDREN|dwStyle,
0, 0,
WindowRect.right-WindowRect.left,
WindowRect.bottom-WindowRect.top,
NULL,
NULL,
hInstance,
NULL);
if(hWnd ==NULL)
{
MessageBox(NULL, L"Fenster konnte nicht erstellt werden.",L"ERROR",MB_OK|MB_ICONEXCLAMATION);
KillGLWindow();
returnfalse;
}
*Über die Forensoftware ärger, die ständig ein " " in den zitierten Text einfügt *
zeig mal bitte, wie du deine WNDCLASSEX initzialiesierst, weil dass was du da machst so schon mal richtig aussieht (na ja fast).
Du benutzt die Funktion ToLPCWSTR falsch. Es wird zwar funktioneren, du brauchst ja aber den Pointer auf den Speicherbereich, denn du in der Funktion allokierst, damit du ihn auch wieder frei geben kannst, denn sonst geistert dir das die ganze Programmlaufzeit durch die Gegend und du kannst bei einem größeren Programm den Speicher komplett damit zumüllen, bis gar nichts mehr geht.
Edit. Fällt mir erst jetzt auf, was machst du mit dem WindowRect(Mit was hast du denn gefüllt)?
Registriert: So Sep 26, 2010 12:54 Beiträge: 238 Wohnort: wieder in Berlin
Programmiersprache: Englisch
statt T"blabla" oder L"blabla" oder "blabla" kannst/solltest du das TEXT makro benutzen... TEXT("blabla") ... so ein L und/oder T oder S überliest man schnell an der Stelle....
Der Fluch der Objektorientierten Programmiersprachen In Delphi sind das genauso alles Zeiger, wie in Java auch. Dort siehst du das nur nicht an der Syntax.
Ich nutze keine WNDCLASSEX sondern nur eine WNDCLASS
Code:
WNDCLASS wc;
wc.style=CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL, IDI_WINLOGO);
wc.hCursor=LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground=NULL;
wc.lpszMenuName=NULL;
wc.lpszClassName=TEXT("OpenGL");
die abfrage hab ich schonmal so verwendet das müsste eigentlich gehen aber ich werde es probieren
€: die geänderte abfrage bringt das selbe ergebniss, ich habe mir überlegt das die ausgabe des debuggers noch von interesse ist weil ihr da mal die genannten Access Violations seht.
Code:
Eine Ausnahme (erste Chance) bei 0xcccccccc in test.exe: 0xC0000005: Access violation.
Eine Ausnahme (erste Chance) bei 0xcccccccc in test.exe: 0xC0000005: Access violation.
Eine Ausnahme (erste Chance) bei 0xcccccccc in test.exe: 0xC0000005: Access violation.
Der Thread 'Win32-Thread' (0x1174) hat mit Code 1964544 (0x1dfa00) geendet.
Das Programm "[4456] test.exe: Systemeigen" wurde mit Code 1964544 (0x1dfa00) beendet.
€: ach ja und darkinsanity dein vorschlag geht leider nicht
Code:
error C2664: 'CreateWindowExW': Konvertierung des Parameters 3 von 'const char *' in 'LPCWSTR' nicht möglich
Mitglieder in diesem Forum: 0 Mitglieder und 16 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.