Бір 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 мінез-құлқын тексеріңіз. Егер ол жаңарту хабарламаларын да жіберсе, оларды көзделген ауқым үшін таңдаңыз.

Қатысты мақалалар