Jediné pretypovanie môže premeniť zdanlivo obyčajného pomocníka nastavení proxy na poruchu závislú od architektúry:

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

Tento kód zúži natívnu adresu na 32-bitové celé číslo, než pridá veľkosť nasledujúcej štruktúry. 64-bitový proces môže obsahovať adresy, ktoré sa nezmestia. V závislosti od konverzie a hodnoty môže byť výsledkom výnimka pretečenia alebo neplatná adresa. Návrat zostavenia na x86 môže chybu skryť, ale ponecháva implementáciu interopu závislú od tohto obchvatu.

Uchovávajte adresy v tvare veľkosti ukazovateľa. Napríklad na prechádzanie už alokovaného poľa možno použiť:

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

Posun zostáva celým číslom; samotná adresa sa cezeň nepretláča. Veľkosť alokácie a index musia byť stále platné.

Potom preskúmajte okolité deklarácie

Možnosti WinINet pre každé pripojenie obsahujú zjednotenie, ktorého členovia zahŕňajú DWORD, ukazovateľ na reťazec a FILETIME. Polia ukazovateľov potrebujú IntPtr; polia DWORD zostávajú 32-bitové. Natívne zarovnanie je dôležité, takže nahradenie každého celého čísla 64-bitovým celým číslom alebo vynútenie zabaleného rozloženia nie je správna oprava.

Pri prechádzaní poľa používajte veľkosť štruktúry po marshalingu, dôsledne zlaďte deklaráciu ANSI alebo Unicode a každú alokáciu sledujte samostatne. Uvoľnenie bloku štruktúr možností automaticky neuvoľní reťazce alokované inde, na ktoré tieto štruktúry odkazujú.

Nakoniec oddelte otázku rozsahu nastavení od správnosti pamäte. Oprava pretypovania nedokazuje, že zvolená možnosť WinINet ovplyvňuje iba jeden ovládací prvok, jeden proces alebo nastavenia aktuálneho používateľa. Overte toto správanie API, než prijmete zvyšok starého príkladu. Ak tiež odosiela oznámenia o obnovení, vyberte ich pre zamýšľaný rozsah.

Súvisiace články