Ang isang cast ay maaaring gawing arkitekturang-dependeng pagkabigo ang isang tila ordinaryong helper sa mga setting ng proxy:

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

Pinapaliit ng code na iyon ang isang native na address sa 32-bit na integer bago idagdag ang laki ng susunod na structure. Ang isang 64-bit na proseso ay maaaring maghawak ng mga address na hindi kasya. Depende sa conversion at value, ang resulta ay maaaring overflow exception o di-wastong address. Ang pagbalik ng build sa x86 ay maaaring magtago ng pagkakamali, ngunit iniiwan ang interop implementation na nakadepende sa workaround na iyon.

Panatilihin ang mga address sa anyo ng laki ng pointer. Halimbawa, ang pag-usad sa isang array na naiallocate na ay maaaring gumamit ng:

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

Ang offset ay nananatiling integer; ang address mismo ay hindi pinipiga sa pamamagitan nito. Ang laki ng allocation at index ay dapat pa ring wasto.

Pagkatapos, suriin ang mga deklarasyon sa paligid

Ang mga opsyon ng WinINet bawat koneksyon ay naglalaman ng union na ang mga miyembro ay may DWORD, string pointer at FILETIME. Ang mga pointer field ay nangangailangan ng IntPtr; ang mga DWORD field ay nananatiling 32-bit. Mahalaga ang native alignment, kaya ang pagpapalit ng bawat integer ng 64-bit na integer o pagpilit ng naka-pack na layout ay hindi matibay na pag-aayos.

Gamitin ang laki ng structure pagkatapos ng marshaling kapag dumadaan sa array, itugma nang pare-pareho ang ANSI o Unicode na deklarasyon, at subaybayan nang hiwalay ang bawat allocation. Ang pagpapalaya sa block ng mga opsyon na structure ay hindi awtomatikong nagpapalaya sa mga string na naiallocate sa ibang lugar at tinutukoy ng mga structure na iyon.

Sa huli, hiwalayin ang tanong ng saklaw ng mga setting mula sa kawastuhan ng memorya. Ang pag-aayos ng cast ay hindi nagpapatunay na ang piniling opsyon ng WinINet ay nakakaapekto lamang sa isang kontrol, isang proseso o mga setting ng kasalukuyang user. Suriin ang gawi ng API na iyon bago tanggapin ang natitirang bahagi ng lumang halimbawa. Kung nagpapadala rin ito ng mga notification ng refresh, piliin ang mga ito para sa inilaan na saklaw.

Kaugnay na mga artikulo