Zašto stari WinINet proxy pomoćnik puca u 64-bitnom buildu
Prepoznajte odsecanje pokazivača u C# proxy interop primerima i pregledajte raspored struktura i vlasništvo nad memorijom pre ponovne upotrebe.
Jedno pretvaranje može naizgled običan pomoćnik za proxy postavke pretvoriti u kvar koji zavisi od arhitekture:
current = (IntPtr)((int)current + optionSize);
Taj kod sužava izvornu adresu na 32-bitni ceo broj pre dodavanja veličine sledeće strukture. 64-bitni proces može držati adrese koje se ne uklapaju. U zavisnosti od pretvorbe i vrednosti, rezultat može biti izuzetak prelivanja ili nevažeća adresa. Vraćanje builda na x86 može sakriti grešku, ali ostavlja interop implementaciju zavisnom od tog zaobilaznog rešenja.
Držite adrese u obliku veličine pokazivača. Na primer, kretanje kroz već dodeljeni niz može koristiti:
IntPtr item = IntPtr.Add(buffer, checked(index * optionSize));
Pomeraj ostaje ceo broj; sama adresa se ne protiskuje kroz njega. Veličina dodele i indeks i dalje moraju biti važeći.
Zatim pregledajte okolne deklaracije
WinINet opcije po vezi sadrže uniju čiji članovi uključuju DWORD, pokazivač na string i FILETIME. Polja pokazivača trebaju IntPtr; DWORD polja ostaju 32-bitna. Izvorno poravnanje je važno, pa zamena svakog celog broja 64-bitnim celim brojem ili prisilno pakiranje rasporeda nije ispravan popravak.
Koristite veličinu strukture nakon marshalinga kada prolazite kroz niz, dosledno uskladite ANSI ili Unicode deklaraciju i pratite svaku dodelu zasebno. Oslobađanje bloka struktura opcija ne oslobađa automatski stringove dodeljene drugde na koje te strukture upućuju.
Konačno, odvojite pitanje obima postavki od ispravnosti memorije. Popravka pretvaranja ne dokazuje da odabrana WinINet opcija utiče samo na jednu kontrolu, jedan proces ili postavke trenutnog korisnika. Proverite to ponašanje API-ja pre nego što prihvatite ostatak starog primera. Ako takođe šalje obaveštenja o osvežavanju, izaberite ih za predviđeni obim.