Bir cast, guya adi proxy parametrləri köməkçisini arxitekturadan asılı nasazlığa çevirə bilər:

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

Bu kod növbəti strukturun ölçüsünü əlavə etməzdən əvvəl yerli ünvanı 32-bit tam ədədə sıxır. 64-bit proses sığmayan ünvanları saxlaya bilər. Çevirmə və dəyərdən asılı olaraq nəticə daşma istisnası və ya etibarsız ünvan ola bilər. Build-i x86-ya qaytarmaq səhvi gizlədə bilər, amma interop tətbiqini həmin müvəqqəti həlldən asılı saxlayır.

Ünvanları göstərici ölçüsündə saxlayın. Məsələn, artıq ayrılmış massivdə irəliləmək üçün bunu istifadə etmək olar:

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

Ofset tam ədəd olaraq qalır; ünvanın özü ondan keçirilmir. Ayrımanın ölçüsü və indeks yenə də etibarlı olmalıdır.

Sonra ətrafdakı bəyannamələri yoxlayın

WinINet-in hər bağlantı üzrə seçimləri tərkibində DWORD, sətir göstəricisi və FILETIME olan birlik (union) saxlayır. Göstərici sahələri IntPtr tələb edir; DWORD sahələri 32-bit olaraq qalır. Yerli düzlənmə vacibdir, ona görə hər tam ədədi 64-bit tam ədədlə əvəz etmək və ya sıxılmış düzüm məcbur etmək düzgün təmir deyil.

Massivdə irəliləyərkən marshal edilmiş struktur ölçüsündən istifadə edin, ANSI və ya Unicode bəyannaməsini ardıcıl uyğunlaşdırın və hər ayrımanı ayrıca izləyin. Seçim strukturlarının blokunu azad etmək başqa yerdə ayrılmış və həmin strukturların istinad etdiyi sətirləri avtomatik azad etmir.

Nəhayət, parametrlərin əhatə dairəsi məsələsini yaddaş düzgünlüyündən ayrı saxlayın. Bir cast-ı təmir etmək köməkçinin seçdiyi WinINet seçiminin yalnız bir idarəetmə elementinə, bir prosesə və ya cari istifadəçinin parametrlərinə təsir etdiyini sübut etmir. Köhnə nümunənin qalan hissəsini qəbul etməzdən əvvəl həmin API davranışını yoxlayın. Əgər yenilənmə bildirişləri də göndərirsə, onları nəzərdə tutulan əhatə üçün seçin.

Əlaqəli məqalələr