Domanda

Qual è il modo corretto di trasmettere da un 'OLE_HANDLE' a un 'HICON' per una build di destinazione x64?

In particolare con un normale cast in stile C, ricevo questo avviso durante la compilazione con una configurazione x64:

avviso C4312: 'type cast': conversione da 'OLE_HANDLE' a 'HICON' di dimensioni maggiori

Ecco il codice offensivo:

imgList.Add((HICON)ohIcon);

Il codice sopra riportato funziona bene per me, ma desidero eliminare l'avviso durante la creazione di x64.

È stato utile?

Soluzione

La H lo dà via, in questo caso il codice della libreria ha creato un tipo distinto per darti un po 'più di sicurezza del tipo (ai tempi delle vecchie API C).

In realtà sono entrambi HANDLE, che è un oggetto kernel a cui non importa davvero quale sia la risorsa, solo che hai un 'handle'. Ricorda che l'API è una C, quindi usa i cast in stile C e quando vieni a eliminarla, usa DeleteObject ().

modifica: 64 bit eh ... il problema è dovuto al fatto che MS ha aggiornato le maniglie a 64 bit, ma ha lasciato solo le cose OLE. Fortunatamente, tutto ciò che hanno fatto è stato riempire i bit extra con zeri.

Prova a utilizzare le LongToHandle routine di conversione e consulta la Guida al porting MIDL - scorri a metà strada verso il basso fino a " ; Gli handle USER e GDI sono valori estesi di segno 32b " sezione.

Altri suggerimenti

Supponendo che tu stia utilizzando Microsoft Visual Studio in base alla domanda ...

Se si sta sviluppando solo per destinazioni a 32 bit, è possibile scegliere di disabilitare questo (e alcuni altri avvisi simili) disattivando l'opzione di progetto " Rileva problemi di portabilità a 64 bit " (Opzione del compilatore C ++ / Wp64).

Se stai sviluppando anche per destinazioni a 64 bit, allora @Harper ha probabilmente ragione e dovrai fare qualche altro scavo nel modo giusto per gestirlo. Potresti voler leggere questo white paper come punto di partenza; vai alla sezione relativa agli handle USER e GDI.

Ho fatto un po 'di ricerche - OLE_HANDLE sembra essere un lungo senza segno e HICON è un vuoto *. In Windows a 32 bit, hanno le stesse dimensioni, ma in Windows x64, il vuoto * è 64 bit. Non esiste un modo sicuro per creare questo cast: i 32 bit extra non sono definiti. Sfortunatamente, l'unico consiglio che sono stato in grado di scavare coinvolgendo ULONG (OLE_HANDLE sono anche animali più rari) ha detto semplicemente "non lanciare questo su un puntatore".

Sospetto che il "corretto" risposta per il "corretto" il modo di lanciarli tra loro è "non farlo". Devo ammettere che non è molto utile ... da dove viene OLE_HANDLE in primo luogo? Sembra che dovrai riscrivere il codice usando OLE_HANDLE per usare HICON ovunque.

HICON hSomeIcon = (HICON) hSomeOLEHandle;

vale a dire. sono intercambiabili.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top