Eén cast kan een ogenschijnlijk gewone helper voor proxy-instellingen veranderen in een architectuurafhankelijke fout:

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

Die code vernauwt een native adres tot een 32-bits geheel getal voordat de grootte van de volgende structuur wordt toegevoegd. Een 64-bits proces kan adressen bevatten die niet passen. Afhankelijk van de conversie en de waarde kan het resultaat een overloopuitzondering of een ongeldig adres zijn. Terugschakelen naar x86 kan de fout verbergen, maar laat de interop-implementatie afhankelijk van die omweg.

Houd adressen in pointerformaat. Om bijvoorbeeld door een al toegewezen array te lopen kan dit worden gebruikt:

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

De offset blijft een geheel getal; het adres zelf wordt er niet doorheen geperst. De toewijzingsgrootte en de index moeten nog steeds geldig zijn.

Inspecteer vervolgens de omliggende declaraties

De WinINet-opties per verbinding bevatten een union waarvan de leden een DWORD, een tekenreeksaanwijzer en een FILETIME omvatten. Aanwijzervelden hebben IntPtr nodig; DWORD-velden blijven 32-bits. Native uitlijning is belangrijk, dus elk geheel getal vervangen door een 64-bits geheel getal of een verpakte indeling forceren is geen degelijke reparatie.

Gebruik de gemarshalde structuurgrootte bij het doorlopen van de array, stem de ANSI- of Unicode-declaratie consistent af en volg elke toewijzing afzonderlijk. Het vrijgeven van het blok met optiestructuren maakt tekenreeksen die elders zijn toegewezen en door die structuren worden aangewezen niet automatisch vrij.

Ten slotte, houd de vraag naar de reikwijdte van instellingen gescheiden van geheugencorrectheid. Het repareren van een cast bewijst niet dat een gekozen WinINet-optie alleen één besturingselement, één proces of de instellingen van de huidige gebruiker beïnvloedt. Controleer dat API-gedrag voordat u de rest van een oud voorbeeld overneemt. Als het ook vernieuwingsmeldingen verstuurt, selecteer ze dan voor de beoogde reikwijdte.

Gerelateerde artikelen