Ena sama pretvorba lahko na videz običajnega pomočnika za nastavitve proxy spremeni v okvaro, odvisno od arhitekture:

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

Ta koda zoži izvorni naslov na 32-bitno celo število, preden doda velikost naslednje strukture. 64-bitni proces lahko hrani naslove, ki se ne prilegajo. Glede na pretvorbo in vrednost je rezultat lahko izjema pri prelivanju ali neveljaven naslov. Vrnitev gradnje na x86 lahko napako skrije, a pusti izvedbo interop odvisno od te obhodne rešitve.

Naslove hranite v obliki velikosti kazalca. Na primer, za premikanje po že dodeljeni matriki lahko uporabite:

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

Odmik ostane celo število; sam naslov se ne stiska skozenj. Velikost dodelitve in indeks morata biti še vedno veljavna.

Nato preglejte okoliške deklaracije

Možnosti WinINet za vsako povezavo vsebujejo unijo, katere člani vključujejo DWORD, kazalec na niz in FILETIME. Polja kazalcev potrebujejo IntPtr; polja DWORD ostanejo 32-bitna. Izvorna poravnava je pomembna, zato zamenjava vsakega celega števila s 64-bitnim celim številom ali vsiljevanje pakirane postavitve ni pravilno popravilo.

Pri prehodu po matriki uporabite velikost strukture po marshalingu, dosledno uskladite deklaracijo ANSI ali Unicode in vsako dodelitev spremljajte ločeno. Sprostitev bloka struktur možnosti ne sprosti samodejno nizov, dodeljenih drugje in na katere te strukture sklicujejo.

Nazadnje, vprašanje obsega nastavitev ločite od pravilnosti pomnilnika. Popravilo pretvorbe ne dokazuje, da izbrana možnost WinINet vpliva le na en kontrolnik, en proces ali nastavitve trenutnega uporabnika. Preverite to vedenje API, preden sprejmete preostanek starega primera. Če pošilja tudi obvestila o osvežitvi, jih izberite za predvideni obseg.

Sorodni članki