Frage zu SetWindowLong



  • ich hab TabCtrl mit subclassing verändert nun kommen zwar keine fehler und funktioniert einwandfrei nur sagt er bei dieser zeile

    [cpp]//...
    g_pfnTab = (WNDPROC)SetWindowLongPtr(hTab,GWL_WNDPROC,(long)SubclassTabProc);
    //..[/cpp]
    

    Folgende Fehler naja eher warnungen

    warning C4311: 'Typumwandlung': Zeigerverkürzung von 'LRESULT (__stdcall *)(HWND,UINT,WPARAM,LPARAM)' zu 'long'
    warning C4312: 'Typumwandlung': Konvertierung von 'LONG' in größeren Typ 'WNDPROC'
    

    hat einer nen rat



  • Zur 1. Warnung: Du musst, wenn Du schon die (64-Bit-kompatible-)Ptr-Version der Funktion verwendest, auch in den Typ LONG_PTR casten (siehe Funktionsdeklaration).
    Zur 2. Warnung: Daran kannst Du nichts ändern. Du kannst die Warnung mit nem

    #pragma warning(disable: 4312)
    

    deaktivieren und danach wieder mit:

    #pragma warning(default: 4312)
    

    re-aktivieren (nur für MS-Compiler). Das ist aber in diesem Fall normal.



  • hate schon so geändert nur kommt imer noch das mit den deaktivieren mach ich noch

    [cpp]g_pfnTab = reinterpret_cast<WNDPROC>(SetWindowLongPtr(hTab,GWL_WNDPROC,reinterpret_cast<LONG_PTR>(SubclassTabProc)));[/cpp]
    


  • Jops, so ists perfekt 👍 . Dann noch die pragma-Anweisung und gut ists 😉 .


  • Mod

    Verstehe ich nicht. Diese Version dürfte doch gar keine Warnung liefern!



  • Also hab ich bei der Korrektur des codes kein mist gebaut @CodeFinder und @Martin Richter ich auch net ,nur hab ich etz trotzdessen diese warnungen . Warnung 4311 is weg dafür etz C4244 und C4312 sieht man ja

    warning C4244: 'Argument': Konvertierung von 'LONG_PTR' in 'LONG', möglicher Datenverlust
    warning C4312: 'reinterpret_cast': Konvertierung von 'LONG' in größeren Typ 'WNDPROC'
    

  • Mod

    Ich kann es für 2003+2005 bestätigen.

    Sehr ominös.

    Scheint aber auch anderen Profis aufgefallen zu sein:
    http://msdn.microsoft.com/msdnmag/issues/01/08/bugslayer/

    Quoted from 'Other Interesting New Compiler Things' section:
    "I've found /Wp64 to be quite helpful, except that the SetWindowLongPtr/GetWindowLongPtr macros, which are supposed to aid 32- and 64-bit access, are defined wrong when doing 32-bit compiles. So with /Wp64, you will have extra warnings around them unless you turn them off with the #pragma warning directives."

    EDIT: Link gefixt



  • cool der link hat mir schon wieder ne frage gespaart das wäre von ner anderen Anwendung ebenfalls nen fehler

    The Compiler Runtime Error Checks Switch
    


  • g_pfnTab = reinterpret_cast<WNDPROC>(SetWindowLongPtr(hTab, GWLP_WNDPROC, static_cast<LONG>(reinterpret_cast<LONG_PTR>(SubclassTabProc))));
    

    Sollte ohne Warnung kompilieren.



  • pock schrieb:

    g_pfnTab = reinterpret_cast<WNDPROC>(SetWindowLongPtr(hTab, GWLP_WNDPROC, static_cast<LONG>(reinterpret_cast<LONG_PTR>(SubclassTabProc))));
    

    Sollte ohne Warnung kompilieren.

    Damit haust Du Dir aber IMHO die 64-Bit-Kompatibilität raus. Also Mist.



  • Danke für die mühe ich lass die warnungen etz stehen , denn als nächstes fangen wir an den Compiler umzuschreiben 😃


  • Mod

    CodeFinder schrieb:

    pock schrieb:

    g_pfnTab = reinterpret_cast<WNDPROC>(SetWindowLongPtr(hTab, GWLP_WNDPROC, static_cast<LONG>(reinterpret_cast<LONG_PTR>(SubclassTabProc))));
    

    Sollte ohne Warnung kompilieren.

    Damit haust Du Dir aber IMHO die 64-Bit-Kompatibilität raus. Also Mist.

    Warum? Oder meinst Du nur weil ich nicht GWLP_... geschrieben habe?



  • Hä hab gerad den überblick verloren



  • Martin Richter schrieb:

    [...]
    Warum? Oder meinst Du nur weil ich nicht GWLP_... geschrieben habe?

    Ähm hä ?
    Du hast das doch gar nicht geschrieben 😕 , das war doch 'pock'. Und ich war mir nicht ganz sicher, ob sich LONG wie LONG_PTR verhält. IMHO ist doch LONG lediglich ein Windows-Datentyp-Synonym für long. LONG_PTR ist dagegen wirklich 64-Bit-kompatibel. Oder wird die Größe von long (und damit auch LONG^^) für 64-Bit-Plattformen automatisch vergrößert ?


  • Mod

    Stimmt! War wohl etwas konfus... 🙂

    Ü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!



  • thanx also kann ich diese warnung ignoriren wenn es um SetWindowLong Geht zumindest solche wie diese 😃


Anmelden zum Antworten