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);
    } // ChildProc
    

    Jetzt 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);
    } // ChildProc
    

    Haben 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


Anmelden zum Antworten