Frage

Was ist der richtige Weg, um von einem "Ole_handle" zu einem "Hicon" für einen X64 -Zielbau zu werfen?

Insbesondere mit einem normalen C-Cast im C-Stil bekomme ich diese Warnung beim Kompilieren mit einer X64-Konfiguration:

Warnung C4312: 'Typ Cast': Konvertierung von 'Ole_handle' zu 'Hicon' von größerer Größe

Hier ist der beleidigende Code:

imgList.Add((HICON)ohIcon);

Der obige Code funktioniert gut für mich, aber ich möchte die Warnung beim Bau von X64 loswerden.

War es hilfreich?

Lösung

Das H verschenkt es, in diesem Fall hat der Bibliothekscode einen bestimmten Typ erstellt, um Ihnen etwas mehr Sicherheit zu bieten (in den Tagen der alten C -APIs).

Es handelt sich tatsächlich um beide Griffe, ein Kernel -Objekt, dem es egal ist, was die Ressource ist, nur dass Sie einen "Handle" haben. Denken Sie daran, dass die API ein C -Einer ist. Verwenden Sie also den C -Stil für C -Stil. Wenn Sie sie löschen, verwenden Sie DeleteObject ().

Bearbeiten: 64 Bit Eh ... das Problem, weil MS aktualisierte Griffe 64 Bit beträgt, aber das Ole -Zeug allein gelassen hat. Glücklicherweise haben sie nur die zusätzlichen Teile mit Nullen gepadelt.

Versuchen Sie es mit dem Longohandle -Konvertierungsroutinen und sehen die MIDL Porting Guide - Scrollen Sie ungefähr auf halber Strecke auf den Abschnitt "Benutzer- und GDI -Griffe sind Sign Extended 32B -Werte".

Andere Tipps

Angenommen, Sie verwenden Microsoft Visual Studio basierend auf der Frage ...

Wenn Sie sich nur für 32-Bit-Ziele entwickeln, können Sie dies (und einige andere ähnliche Warnungen) deaktivieren, indem Sie die Projektoption ausschalten "64-Bit-Portabilitätsprobleme erkennen" (C ++ Compiler-Option /WP64).

Wenn Sie sich auch für 64-Bit-Ziele entwickeln, ist @harper wahrscheinlich richtig und Sie müssen mehr auf dem richtigen Weg graben, um dies zu verarbeiten. Vielleicht möchten Sie lesen Dieses weiße Papier als Ausgangspunkt; Gehen Sie zum Abschnitt über Benutzer- und GDI -Handles.

Ich habe ein wenig gegraben - Ole_handle scheint ein nicht signiertes langes Lang zu sein, und Hicon ist eine Leere*. In 32 -Bit -Fenstern sind diese gleich groß, aber in Windows X64 beträgt der Hohlraum* 64 Bit. Es gibt keinen sicheren Weg, um diese Besetzung zu machen - die zusätzlichen 32 Bit sind undefiniert. Leider war der einzige Rat, den ich mit Ulongs ausgraben konnte (Ole_Handles sind noch seltenere Bestien), einfach "Wirken Sie dies nicht an einen Zeiger".

Ich vermute, dass die "korrekte" Antwort auf die "richtige" Art, zwischen ihnen zu werfen, "das nicht tun" ist. Zugegeben, das ist nicht sehr hilfreich ... woher kommt der Ole_handle überhaupt? Es hört sich so an, als müssten Sie den Code mit Ole_handle umschreiben, um Hicon überall zu verwenden.

HICON hSomeIcon = (HICON) hSomeOLEHandle;

dh sie sind austauschbar.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top