Get/SetWindowLongPtr - Wie macht man es richtig?
-
Hallo!
Ich rufe, beispielweise in WM_INITDIALOG, dieses hier auf:
SetWindowLongPtr(hWnd, DWLP_USER, lParam);Obiges endet in der Warnung 4244: "'Argument': Konvertierung von 'LPARAM' in 'LONG', möglicher Datenverlust". Da ich nun Warnungen als Fehler behandele, bremst mich das ein wenig aus. Natürlich könnte ich /Wp64 weglassen, aber ich will die Prüfung eigentlich nicht ausschalten, ich habe es doch ganz bewusst eingeschaltet. Auch kann ich ganz einfach nach LONG casten. Aber ich will doch gar nicht LONG haben, sondern LONG_PTR. Deswegen benutze ich schließlich SetWindowLongPtr und nicht etwa SetWindowLong. Also habe ich jetzt in einem Header dieses hier stehen:
__forceinline LONG_PTR MySetWindowLongPtr(HWND hWnd, int nIndex, LONG_PTR dwNewLong) { #pragma warning(push) #pragma warning(disable: 4244) return(SetWindowLongPtr(hWnd, nIndex, dwNewLong)); #pragma warning(pop) }Damit geht's. Ich frage mich aber, ob es nicht eine elegantere Möglichkeit gibt. Wie geht Ihr denn mit dem Problem um?
-
Ich sehe das Problem nicht, die typedefs sehen doch so aus
// BaseTsd.h typedef __int64 LONG_PTR; // windef.h typedef LONG_PTR LPARAM;
-
Das Problem ist, dass es eine Warnung gibt, da ich für 32 Bit mit dem Schalter /Wp64 übersetze. Daher:
#define SetWindowLongPtr SetWindowLongPtrW #define SetWindowLongPtrW SetWindowLongW WINUSERAPI LONG WINAPI SetWindowLongA( __in HWND hWnd, __in int nIndex, __in LONG dwNewLong);Die Warnung geht also in Ordnung, nur will ich sie nicht haben!
-
Auf den ersten Blick sieht es so aus, daß Dein Problem nicht in Deiner Funktion MySetWindowLongPtr() zu finden ist.
Dir sollte aber bewußt sein, daß Du eine Inline-Funktion definiert hast?
D.h. der Compiler hat höchstwahrscheinlich auf unterschiedlichen Typen bei einem der Übergabeparameter gewarnt.Zeig mal den Code, wie Du diese Funktion aufrufst.
Martin
-
Schmeiß /Wp64 raus, ist sowieso deprecated...
Übrigends habe ich in der Produktgruppe nachgefragt.
Das Problem ist, dass es unter Win32 keine eigenständige Funktion SetWindowLongPtr gibt. Das ist nichts als ein define auf SetWindowLong.
Daher sind die Warnings by Design durch das SDK! Bekannt seit ewig, aber es gibt keinen Fix dafür...
Treten übrigens nur bei SetWindowLongPtr auf!
-
Mmacher schrieb:
Auf den ersten Blick sieht es so aus, daß Dein Problem nicht in Deiner Funktion MySetWindowLongPtr() zu finden ist.
Missverständnis. MySetWindowLongPtr verursacht kein Problem, sondern löst es erstmal.
Mmacher schrieb:
Dir sollte aber bewußt sein, daß Du eine Inline-Funktion definiert hast?
Dessen bin ich mir bewusst, und das soll auch so sein.
-
Martin Richter schrieb:
Schmeiß /Wp64 raus, ist sowieso deprecated...
Es ist deprecated? Dazu kann ich im verlinkten Thread nichts finden, außer das andere das selbe Problem haben. Was verwende ich dann aber anstelle dessen, einfach nur /RTCc (benutze ich ohnehin in der Debug-Version)?
Martin Richter schrieb:
Übrigends habe ich in der Produktgruppe nachgefragt.
Das Problem ist, dass es unter Win32 keine eigenständige Funktion SetWindowLongPtr gibt. Das ist nichts als ein define auf SetWindowLong.
Daher sind die Warnings by Design durch das SDK! Bekannt seit ewig, aber es gibt keinen Fix dafür...
Treten übrigens nur bei SetWindowLongPtr auf!Na gut, ich habe jetzt nicht gefragt, sondern einfach im Header nachgeschaut. Das Ergebnis ist aber das selbe.

-
/Wp64 ist in VS-2010 deprecated, steht doch in der MSDN!
http://msdn.microsoft.com/en-us/library/yt4xw8fh.aspxImportant
The /Wp64 compiler option and __w64 keyword are deprecated in Visual Studio 2010. If you convert a project that uses this switch, the switch will not be migrated during conversion. To use this option in Visual Studio 2010, you must type the compiler switch under Additional Options in the Command Line section of the project properties. If you use the /Wp64 compiler option on the command line, the compiler issues Command-Line Warning D9035. Instead of using this option and keyword to detect 64-bit portability issues, use a Visual C++ compiler that targets a 64-bit platform. For more information, see 64-Bit Programming with Visual C++.
-
Martin Richter schrieb:
/Wp64 ist in VS-2010 deprecated, steht doch in der MSDN!
Dieses Ausrufezeichen macht mich ganz kribbelig. Warum verweist Du nicht auf MSDN, wenn Du MSDN meinst, sondern auf einen Thread, der die Frage nicht beantwortet? In der Doku zu meinem Studio 2005 taucht dieser Hinweis übrigens nicht auf.
-
Mox schrieb:
Martin Richter schrieb:
/Wp64 ist in VS-2010 deprecated, steht doch in der MSDN!
Dieses Ausrufezeichen macht mich ganz kribbelig. Warum verweist Du nicht auf MSDN, wenn Du MSDN meinst, sondern auf einen Thread, der die Frage nicht beantwortet? In der Doku zu meinem Studio 2005 taucht dieser Hinweis übrigens nicht auf.
Was macht Dich kribbelig?
Ich habe auf den Thread verwiesen, weil er das Problem mit dem SetWindowLong(Ptr) behandelt und wiel ich extra deswegen bereits die Compiler Produktgruppe kontaktiert habe und es ein grundsätzliches Problem beschreibt!Das das ganze deprecated ist ist ja erst seit VS-2010 so. Du hattest allerdings nicht den eingesetzten Compiler dazugeschrieben, ich gehe dann davon aus, dass die Leute "die aktuelle Version" einsetzen.
Wenn es aber in 2010 deprectaed ist würde ich es auch in 2005 nicht mehr einsetzen... es gibt genug Gründe warum /Wp64 eigentlich oft genug nicht getan hat was es sollte.