Seite 1 von 1

Unütze Konvertierung?

Verfasst: Mi Feb 11, 2009 5:12 pm
von cloidnerux
Also ich hab folgendes Problem:
Ich versuche mich ja gerade an OpenGL und ich bekomme so ein Porgramm nicht kompiliert.
Platform. Windows Xp-32Bit
IDE: VC++ 2005 (Ich weiß das ihr das nciht so gut findet)
Fehler:

Code: Alles auswählen

c:\dokumente und einstellungen\jack\eigene dateien\visual studio 2005\projects\opengltest\opengltest\main.cpp(262) : error C2664: 'MessageBoxW': Konvertierung des Parameters 2 von 'const char [31]' in 'LPCWSTR' nicht möglich
        Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
So, jezt werdet ihr sagen: mach doch das reinterpret_cast..., das will ich aber nicht.
Das aus folgendem Grund:
Anderes Programm, wieder VC++, selber code, aber das Problem nicht??????
Der code ist:

Code: Alles auswählen

MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
Der Fehler bezieht sich auf das "Failed..." und ncoh auf ein Paar andere Strings, die hier aber nebensache ist.
Warum wird bei einem Projekt der fehler nicht gemeldet, bei dem anderen projekt, selber Headerdateien?

Re: Unütze Konvertierung?

Verfasst: Mi Feb 11, 2009 8:52 pm
von Dirty Oerti
Ich kann nur mutmaßen, da ich den Code des Fehlerverursachenden Programms nicht kenne.

Fehler tritt nicht auf, wenn du den Text direkt in den Parameter in Form von (...,"Text...",...) schreibst.
Fehler tritt auf, wenn du es in der Form (...,text_str,...) schreibst.

Liege ich damit richitg?

Re: Unütze Konvertierung?

Verfasst: Mi Feb 11, 2009 8:54 pm
von cloidnerux
Nein.
Der Fehler triit bei einem Projekt auf, bei einem Anderen nicht, obwohl beide identische Compileraufrufe haben.

Re: Unütze Konvertierung?

Verfasst: Mi Feb 11, 2009 9:00 pm
von Dirty Oerti
Wie sieht denn der genaue Code aus?
Dann kann ich dir vielleicht helfen...

Re: Unütze Konvertierung?

Verfasst: Mi Feb 11, 2009 9:06 pm
von cloidnerux

Code: Alles auswählen

MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
Es ist nur so, das ich unter MS VC++ Express ein nues Windows Projekt gestartet habe, die Messagebox aufgerufen und dann habe ich diese Fehlermeldung bekommen.
Bei einem Anderen projekt nachgeschaut, selbe Header, selbe Funktion, aber kein Fehler??????
Also in den Projekteinstellungen nachgeschaut und angeglcihen, immernoch der Fehler.
Das ist zum Mäuse melken.

Re: Unütze Konvertierung?

Verfasst: Mi Feb 11, 2009 10:08 pm
von Xin
cloidnerux hat geschrieben:

Code: Alles auswählen

MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
Es ist nur so, das ich unter MS VC++ Express ein nues Windows Projekt gestartet habe, die Messagebox aufgerufen und dann habe ich diese Fehlermeldung bekommen.
Bei einem Anderen projekt nachgeschaut, selbe Header, selbe Funktion, aber kein Fehler??????
Also in den Projekteinstellungen nachgeschaut und angeglcihen, immernoch der Fehler.
Das ist zum Mäuse melken.
Versuch MessageBoxA().

Re: Unütze Konvertierung?

Verfasst: Do Feb 12, 2009 11:28 am
von fat-lobyte
cloidnerux hat geschrieben:Also ich hab folgendes Problem:
Ich versuche mich ja gerade an OpenGL und ich bekomme so ein Porgramm nicht kompiliert.
Platform. Windows Xp-32Bit
IDE: VC++ 2005 (Ich weiß das ihr das nciht so gut findet)
Fehler:

Code: Alles auswählen

c:\dokumente und einstellungen\jack\eigene dateien\visual studio 2005\projects\opengltest\opengltest\main.cpp(262) : error C2664: 'MessageBoxW': Konvertierung des Parameters 2 von 'const char [31]' in 'LPCWSTR' nicht möglich
        Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
So, jezt werdet ihr sagen: mach doch das reinterpret_cast..., das will ich aber nicht.
Das aus folgendem Grund:
Anderes Programm, wieder VC++, selber code, aber das Problem nicht??????
Der code ist:

Code: Alles auswählen

MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
Der Fehler bezieht sich auf das "Failed..." und ncoh auf ein Paar andere Strings, die hier aber nebensache ist.
Warum wird bei einem Projekt der fehler nicht gemeldet, bei dem anderen projekt, selber Headerdateien?
Die Sache ist ganz einfach: Du übergibst einen Zeiger auf ein konstantes Char- Array. Die Funktion erwartet aber den Parameter "LPCWSTR", was auf Microsoftisch "Long pointer to constant wide string" bedeutet. Das ist also ein Zeiger auf ein konstantes wchar_t Array, das ist ein Datentyp für Zeichen indem auch Unicode Zeichen platz finden.

Der Grund dass es bei einem Funktioniert und beim anderen nicht ist, dass wahrscheinlich je nach Projekteinstellungen (oder deklarationen in header) entweder LPCWSTR selbst oder die Funktion nicht gleich deklariert ist.

Die Lösung deines Problems ist entweder die Funktion von Xin zu verwenden (ich nehme an das ist eine narrow- char variante der gleichen funktion), oder aber, was eigentlich eleganter wäre:
Setz deine Strings in TEXT makros, das sieht so aus: TEXT("Failed To Register The Window Class.")
Das Makro bewirkt, dass in in Unicode Builds daraus ein wide- char Array wird, und in normalen builds ein narrow- char Array, und das würde genau dein Problem lösen.
Wenn du selbst bestimmen willst, dass das ein Widechar array werden soll, dann setz ein "L" vor oder nach den string, das sieht so aus L"Failed To Register The Window Class." oder "Failed To Register The Window Class."L

hoffe das hat geholfen.
mfg, fat-lobyte

Re: Unütze Konvertierung?

Verfasst: Do Feb 12, 2009 5:30 pm
von cloidnerux
OK, werde es mal versuchen.