Frage zu SetWindowLong



  • 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