Viens cast var pārvērst šķietami parastu starpniekservera iestatījumu palīgu arhitektūras atkarīgā kļūmē:

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

Šis kods sašaurina vietējo adresi līdz 32 bitu veselam skaitlim, pirms pievieno nākamās struktūras izmēru. 64 bitu process var saturēt adreses, kas neietilpst. Atkarībā no konversijas un vērtības rezultāts var būt pārplūdes izņēmums vai nederīga adrese. Būves atgriešana uz x86 var paslēpt kļūdu, bet atstāj interop ieviešanu atkarīgu no šī apiešanas risinājuma.

Turiet adreses rādītāja izmēra formā. Piemēram, lai virzītos pa jau piešķirtu masīvu, var izmantot:

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

Nobīde paliek vesels skaitlis; pati adrese netiek izspiesta caur to. Piešķīruma izmēram un indeksam joprojām jābūt derīgiem.

Pēc tam pārbaudiet apkārtējos deklarācijas

WinINet opcijas katram savienojumam ietver apvienību, kuras locekļi ir DWORD, virknes rādītājs un FILETIME. Rādītāja laukiem nepieciešams IntPtr; DWORD lauki paliek 32 bitu. Vietējā izlīdzināšana ir svarīga, tāpēc katra veselā skaitļa aizstāšana ar 64 bitu veselu skaitli vai iepakota izkārtojuma uzspiešana nav pareizs labojums.

Izmantojiet struktūras izmēru pēc marshaling, ejot cauri masīvam, konsekventi saskaņojiet ANSI vai Unicode deklarāciju un izsekojiet katram piešķīrumam atsevišķi. Opciju struktūru bloka atbrīvošana automātiski neatbrīvo citur piešķirtas virknes, uz kurām šīs struktūras atsaucas.

Visbeidzot, nošķiriet iestatījumu tvēruma jautājumu no atmiņas pareizības. Cast salabošana nepierāda, ka palīga izvēlētā WinINet opcija ietekmē tikai vienu vadīklu, vienu procesu vai pašreizējā lietotāja iestatījumus. Pārbaudiet šo API uzvedību, pirms pārņemat pārējo veco paraugu. Ja tas arī sūta atsvaidzināšanas paziņojumus, izvēlieties tos paredzētajam tvērumam.

Saistītie raksti