Zašto stari WinINet proxy pomoćnik puca u 64-bitnom buildu
Prepoznajte odsijecanje pokazivača u C# proxy interop primjerima i pregledajte raspored struktura i vlasništvo nad memorijom prije ponovne upotrebe.
Jedno pretvaranje može naizgled običan pomoćnik za proxy postavke pretvoriti u kvar koji ovisi o arhitekturi:
current = (IntPtr)((int)current + optionSize);
Taj kod sužava izvornu adresu na 32-bitni cijeli broj prije dodavanja veličine sljedeće strukture. 64-bitni proces može držati adrese koje se ne uklapaju. Ovisno o pretvorbi i vrijednosti, rezultat može biti iznimka prelijevanja ili nevažeća adresa. Vraćanje builda na x86 može sakriti pogrešku, ali ostavlja interop implementaciju ovisnom o tom zaobilaznom rješenju.
Držite adrese u obliku veličine pokazivača. Na primjer, kretanje kroz već dodijeljeni niz može koristiti:
IntPtr item = IntPtr.Add(buffer, checked(index * optionSize));
Pomak ostaje cijeli broj; sama adresa se ne protiskuje kroz njega. Veličina dodjele 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 zamjena svakog cijelog broja 64-bitnim cijelim brojem ili prisilno pakiranje rasporeda nije ispravan popravak.
Koristite veličinu strukture nakon marshalinga kada prolazite kroz niz, dosljedno uskladite ANSI ili Unicode deklaraciju i pratite svaku dodjelu zasebno. Oslobađanje bloka struktura opcija ne oslobađa automatski stringove dodijeljene drugdje na koje te strukture upućuju.
Konačno, odvojite pitanje opsega postavki od ispravnosti memorije. Popravak pretvorbe ne dokazuje da odabrana WinINet opcija utječe samo na jednu kontrolu, jedan proces ili postavke trenutnog korisnika. Provjerite to ponašanje API-ja prije nego prihvatite ostatak starog primjera. Ako također šalje obavijesti o osvježavanju, odaberite ih za predviđeni opseg.