Un solo cast può trasformare un helper per le impostazioni proxy apparentemente ordinario in un guasto dipendente dall'architettura:

current = (IntPtr)((int)current + optionSize);

Quel codice restringe un indirizzo nativo a un intero a 32 bit prima di aggiungere la dimensione della struttura successiva. Un processo a 64 bit può contenere indirizzi che non ci stanno. A seconda della conversione e del valore, il risultato può essere un'eccezione di overflow o un indirizzo non valido. Riportare la build a x86 può nascondere l'errore, ma lascia l'implementazione dell'interop dipendente da quel workaround.

Mantieni gli indirizzi nella forma della dimensione di un puntatore. Ad esempio, per avanzare in un array già allocato si può usare:

IntPtr item = IntPtr.Add(buffer, checked(index * optionSize));

L'offset resta un intero; l'indirizzo stesso non viene compresso attraverso uno. La dimensione dell'allocazione e l'indice devono comunque essere validi.

Poi esamina le dichiarazioni circostanti

Le opzioni WinINet per connessione contengono un'unione i cui membri includono un DWORD, un puntatore a stringa e un FILETIME. I campi puntatore richiedono IntPtr; i campi DWORD restano a 32 bit. L'allineamento nativo conta, quindi sostituire ogni intero con un intero a 64 bit o forzare un layout compattato non è una riparazione solida.

Usa la dimensione della struttura dopo il marshaling quando scorri l'array, abbina coerentemente la dichiarazione ANSI o Unicode e traccia ogni allocazione separatamente. Liberare il blocco delle strutture di opzione non rilascia automaticamente le stringhe allocate altrove e referenziate da quelle strutture.

Infine, tieni separata la questione dell'ambito delle impostazioni dalla correttezza della memoria. Riparare un cast non dimostra che l'opzione WinINet scelta da un helper influenzi solo un controllo, un processo o le impostazioni dell'utente corrente. Verifica quel comportamento dell'API prima di adottare il resto di un vecchio esempio. Se invia anche notifiche di aggiornamento, selezionale per l'ambito previsto.

Articoli correlati