WinINet ပရောက်စီအကူအညီဟောင်း 64-bit build တွင် အဘယ်ကြောင့်ပျက်သနည်း
C# ပရောက်စီ interop နမူနာများရှိ ညွှန်ပြချက်ဖြတ်တောက်မှုကို ဖော်ထုတ်ပြီး ပြန်လည်အသုံးမပြုမီ ဖွဲ့စည်းပုံအပြင်အဆင်နှင့် မမ်မိုရီပိုင်ဆိုင်မှုကို စစ်ဆေးပါ။
cast တစ်ခုက သာမန်ဟန်တူသော ပရောက်စီဆက်တင်အကူအညီကို ဗိသုကာမှီခိုသော ချို့ယွင်းမှုအဖြစ် ပြောင်းနိုင်သည်။
current = (IntPtr)((int)current + optionSize);
ထို ကုဒ်သည် နောက်ဖွဲ့စည်းပုံ၏ အရွယ်အစားကို မပေါင်းမီ မူရင်းလိပ်စာကို 32-bit ကိန်းပြည့်သို့ ကျဉ်းစေသည်။ 64-bit လုပ်ငန်းစဉ်သည် မဆံ့သော လိပ်စာများကို ကိုင်ထားနိုင်သည်။ ပြောင်းလဲမှုနှင့် တန်ဖိုးပေါ်မူတည်၍ ရလဒ်သည် overflow ခြွင်းချက် သို့မဟုတ် မမှန်ကန်သော လိပ်စာ ဖြစ်နိုင်သည်။ build ကို x86 သို့ ပြန်ပြောင်းခြင်းက အမှားကို ဖုံးကွယ်နိုင်သော်လည်း interop အကောင်အထည်ဖော်မှုကို ထို ဖြေရှင်းနည်းအပေါ် မှီခိုစေသည်။
လိပ်စာများကို ညွှန်ပြအရွယ်အစားပုံစံဖြင့် ထားပါ။ ဥပမာ၊ ခွဲဝေပြီးသား အခင်းတစ်ခုကို ဖြတ်သန်းရန် အောက်ပါကို အသုံးပြုနိုင်သည်။
IntPtr item = IntPtr.Add(buffer, checked(index * optionSize));
အော့ဖ်ဆက်သည် ကိန်းပြည့်အဖြစ် ကျန်နေသည်။ လိပ်စာကိုယ်တိုင် ယင်းမှတစ်ဆင့် ညှစ်ထုတ်ခြင်း မခံရပါ။ ခွဲဝေမှုအရွယ်အစားနှင့် အညွှန်းသည် တရားဝင်နေရမည်။
ထို့နောက် ပတ်ဝန်းကျင်ရှိ ကြေညာချက်များကို စစ်ဆေးပါ
WinINet ၏ ချိတ်ဆက်မှုတစ်ခုချင်း ရွေးချယ်စရာများတွင် DWORD၊ စာကြောင်းညွှန်ပြနှင့် FILETIME ပါဝင်သော union တစ်ခု ရှိသည်။ ညွှန်ပြအကွက်များအတွက် IntPtr လိုအပ်သည်။ DWORD အကွက်များသည် 32-bit အဖြစ် ကျန်သည်။ မူရင်း အညီအညွတ်ဖြစ်မှု အရေးကြီးသဖြင့် ကိန်းပြည့်တိုင်းကို 64-bit ကိန်းပြည့်ဖြင့် အစားထိုးခြင်း သို့မဟုတ် ထုပ်ပိုးထားသော အပြင်အဆင်ကို အတင်းအကြပ် သတ်မှတ်ခြင်းသည် မှန်ကန်သော ပြုပြင်မှု မဟုတ်ပါ။
အခင်းကို ဖြတ်သန်းစဉ် marshaling ပြီးနောက် ဖွဲ့စည်းပုံအရွယ်အစားကို အသုံးပြုပါ၊ ANSI သို့မဟုတ် Unicode ကြေညာချက်ကို တစ်သမတ်တည်း ကိုက်ညီစေပြီး ခွဲဝေမှုတစ်ခုချင်းကို သီးခြား ခြေရာခံပါ။ ရွေးချယ်စရာ ဖွဲ့စည်းပုံများ၏ ဘလောက်ကို လွှတ်ပေးခြင်းသည် အခြားနေရာတွင် ခွဲဝေပြီး ထို ဖွဲ့စည်းပုံများက ရည်ညွှန်းသော စာကြောင်းများကို အလိုအလျောက် မလွှတ်ပေးပါ။
နောက်ဆုံးတွင် ဆက်တင်များ၏ နယ်ပယ်မေးခွန်းကို မမ်မိုရီမှန်ကန်မှုနှင့် ခွဲထားပါ။ cast ပြုပြင်ခြင်းသည် အကူအညီက ရွေးချယ်သော WinINet ရွေးချယ်စရာသည် ထိန်းချုပ်မှုတစ်ခု၊ လုပ်ငန်းစဉ်တစ်ခု သို့မဟုတ် လက်ရှိအသုံးပြုသူ၏ ဆက်တင်များကိုသာ သက်ရောက်သည်ဟု သက်သေမပြပါ။ နမူနာဟောင်း၏ ကျန်အပိုင်းကို လက်ခံမီ ထို API အပြုအမူကို စစ်ဆေးပါ။ ၎င်းသည် ပြန်လည်စတင်အသိပေးချက်များကိုပါ ပို့ပါက ရည်ရွယ်ထားသော နယ်ပယ်အတွက် ၎င်းတို့ကို ရွေးပါ။