Një cast i vetëm mund ta kthejë një ndihmës në dukje të zakonshëm të cilësimeve të proxit në një dështim që varet nga arkitektura:

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

Ai kod e ngushton një adresë amtare në një numër të plotë 32-bit përpara se të shtojë madhësinë e strukturës tjetër. Një proces 64-bit mund të mbajë adresa që nuk përshtaten. Në varësi të konvertimit dhe vlerës, rezultati mund të jetë një përjashtim tejmbushjeje ose një adresë e pavlefshme. Kthimi i ndërtimit në x86 mund ta fshehë gabimin, por e lë zbatimin e interop-it të varur nga ajo zgjidhje.

Mbajini adresat në formën e madhësisë së treguesit. Për shembull, për të ecur nëpër një varg tashmë të alokuar mund të përdoret:

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

Zhvendosja mbetet numër i plotë; vetë adresa nuk shtrydhet përmes një të tilli. Madhësia e alokimit dhe indeksi duhet të jenë ende të vlefshëm.

Pastaj shqyrtoni deklarimet përreth

Opsionet e WinINet për çdo lidhje përmbajnë një bashkim, anëtarët e të cilit përfshijnë një DWORD, një tregues vargu dhe një FILETIME. Fushat e treguesve kërkojnë IntPtr; fushat DWORD mbeten 32-bit. Rreshtimi amtar ka rëndësi, prandaj zëvendësimi i çdo numri të plotë me një numër të plotë 64-bit ose imponimi i një shtrirjeje të paketuar nuk është një rregullim i shëndoshë.

Përdorni madhësinë e strukturës pas marshaling kur ecni nëpër varg, përputhni vazhdimisht deklarimin ANSI ose Unicode dhe ndiqni çdo alokim veçmas. Lirimi i bllokut të strukturave të opsioneve nuk i liron automatikisht vargjet e alokuara diku tjetër dhe të referuara nga ato struktura.

Më në fund, mbani çështjen e shtrirjes së cilësimeve të ndarë nga korrektësia e memories. Rregullimi i një cast nuk provon që opsioni i zgjedhur i WinINet prek vetëm një kontroll, një proces ose cilësimet e përdoruesit aktual. Kontrolloni atë sjellje të API-së përpara se të miratoni pjesën tjetër të një shembulli të vjetër. Nëse dërgon gjithashtu njoftime rifreskimi, zgjidhni ato për shtrirjen e synuar.

Artikuj të ngjashëm