Warnung beim Cast LONG_PTR nach LONG
-
Hallo,
im Moment beschäftige ich mich mit dem Windows-Nachrichtensystem und der WINAPI. Dafür habe ich mir auch ein kleines Beispiel mit einigen Controls geschrieben.
Für das Abfangen der Return-Taste bei der Editbox hatte ich unter www.winapi.net eine Lösung gefunden. Die Lösung castet im Funktionsaufruf SetWindowLongPtr() den Callback ChildProc auf LONG_PTR. Dabei bekomme ich die Warnung ***"conversion from 'LONG_PTR' to 'LONG', possible loss of data"***.// ... PrevWndProcEdit = SetWindowLongPtr(hEditBox,GWLP_WNDPROC,(LONG_PTR)ChildProc); // ... LRESULT CALLBACK ChildProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { if (message == WM_KEYDOWN && wParam == VK_RETURN) { char szText[256]; // Text aus der Editbox holen GetWindowText(hEditBox, szText, 256); // Diesen Text in das Lable schreiben und // den Text der Editbox löschen SetWindowText(hText,szText); SetWindowText(hEditBox,""); return (0); } return CallWindowProc((WNDPROC)PrevWndProcEdit,hWnd,message,wParam,lParam); } // ChildProcJetzt habe ich zwei Fragen:
- Wie bekomme ich die Warnung weg?
- Wann kann ich ein Cast im C++ Stil verwenden? Hier ergibt sich ein Fehler, wenn ich ihn einsetzen will.
Vielen Dank schon im Voraus für Antworten.

Gruss Stefan
-
noram schrieb:
- Wie bekomme ich die Warnung weg?
mit
#pragma warning( disable : 4311 ) PrevWndProcEdit = SetWindowLongPtr( hEditBox, GWLP_WNDPROC, (LONG_PTR)ChildProc ); #pragma warning( default : 4311 )noram schrieb:
Wann kann ich ein Cast im C++ Stil verwenden? Hier ergibt sich ein Fehler, wenn ich ihn einsetzen will.
Du kannst C++-Style Casts in C++-Code verwenden... zB:
PrevWndProcEdit = SetWindowLongPtr( hEditBox, GWLP_WNDPROC, reinterpret_cast< LONG_PTR >( ChildProc ) );Greetz, Swordfish
-
Vielen Dank Swordfish.
Mein Code sieht nun mit Deinen Änderungen so aus.... #pragma warning( disable : 4244 ) PrevWndProcEdit = SetWindowLongPtr( hEditBox, GWLP_WNDPROC, reinterpret_cast< LONG_PTR > (ChildProc) ); #pragma warning( default : 4244 ) ... LRESULT CALLBACK ChildProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { if (message == WM_KEYDOWN && wParam == VK_RETURN) { char szText[256]; // Text aus der Editbox holen GetWindowText(hEditBox, szText, 256); // Diesen Text in das Lable schreiben und // den Text der Editbox löschen SetWindowText(hText,szText); SetWindowText(hEditBox,""); return (0); } return CallWindowProc((WNDPROC)PrevWndProcEdit,hWnd,message,wParam,lParam); } // ChildProcHaben die Callbacks stehts einen Wertebereich wie LONG_PTR oder kann es da zu Datenverlust beim Casten kommen?
Gruss
Stefan
-
noram schrieb:
Haben die Callbacks stehts einen Wertebereich wie LONG_PTR oder kann es da zu Datenverlust beim Casten kommen?
"Callbacks" sind nichts anderes als
Funktionszeiger und sind auf 32-Bit-Systemen immer 32 Bit und auf 64-Bit-System immer 64 Bit breit. Da auf 64-Bit-Systemen LONG_PTR ein typedef auf __uint64 sein sollte gibt es auch da keine Probleme.Greetz, Swordfish
-
Nochmal vielen Dank Swordfish. Damit sind alle meine Fragen beantwortet und es hat mir wirklich weitergeholfen.

Greetz, Stefan