Бир cast көрүнөө жөнөкөй прокси жөндөөлөрүнүн жардамчысын архитектурага көз каранды бузулууга айландырышы мүмкүн:

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

Ал код кийинки структуранын өлчөмүн кошуудан мурун байыркы даректи 32-биттик бүтүн санга куушурат. 64-биттик процесс батпаган даректерди кармай алат. Айландырууга жана мааниге жараша натыйжа толуп кетүү бүтүнөн тыш же жараксыз дарек болушу мүмкүн. Курулушту x86-га кайтаруу катаны жашырышы мүмкүн, бирок interop аткарылышын ошол айланып өтүүгө көз каранды калтырат.

Даректерди көрсөткүч өлчөмүндөгү формада сактаңыз. Мисалы, буга чейин бөлүнгөн массивден өтүү үчүн муну колдонсо болот:

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

Ылдамдык бүтүн сан бойдон калат; даректин өзү анын ичинен кысылбайт. Бөлүүнүн өлчөмү жана индекси дагы эле жарактуу болушу керек.

Андан кийин айлана-чөйрөдөгү декларацияларды текшериңиз

WinINetтин ар бир туташуу боюнча параметрлери курамында DWORD, сап көрсөткүчү жана FILETIME бар биримдикти камтыйт. Көрсөткүч талааларына IntPtr керек; DWORD талаалары 32-биттик бойдон калат. Байыркы тегиздөө маанилүү, ошондуктан ар бир бүтүн санды 64-биттик бүтүн сан менен алмаштыруу же таңууланган таңгакталган жайгашуу туура оңдоо эмес.

Массивден өткөндө marshaling-дан кийинки структуранын өлчөмүн колдонуңуз, ANSI же Unicode декларациясын ырааттуу шайкештештириңиз жана ар бир бөлүүнү өзүнчө көзөмөлдөңүз. Параметр структураларынын блогун бошотуу башка жерде бөлүнгөн жана ошол структуралар шилтеме кылган саптарды автоматтык түрдө бошотпойт.

Акыры, жөндөөлөрдүн камтылышы маселесин эстутумдун тууралыгынан бөлүп кармаңыз. Cast-ты оңдоо жардамчы тандаган WinINet параметри бир гана башкаруу элементине, бир процесске же учурдагы колдонуучунун жөндөөлөрүнө таасир этээрин далилдебейт. Эски үлгүнүн калган бөлүгүн кабыл алуудан мурун ошол API жүрүм-турумун текшериңиз. Эгер ал жаңыртуу билдирүүлөрүн да жөнөтсө, аларды көздөлгөн камтылыш үчүн тандаңыз.

Тектеш макалалар