పాత WinINet ప్రాక్సీ సహాయకుడు 64-బిట్ బిల్డ్లో ఎందుకు విరిగిపోతుంది
C# ప్రాక్సీ ఇంటరాప్ ఉదాహరణలలో పాయింటర్ కత్తిరింపును గుర్తించి, మళ్లీ ఉపయోగించే ముందు నిర్మాణ లేఅవుట్ మరియు మెమరీ యాజమాన్యాన్ని సమీక్షించండి.
ఒక కాస్ట్ సాధారణంగా కనిపించే ప్రాక్సీ-సెట్టింగ్ల సహాయకుడిని ఆర్కిటెక్చర్-ఆధారిత వైఫల్యంగా మార్చగలదు:
current = (IntPtr)((int)current + optionSize);
ఆ కోడ్ తదుపరి నిర్మాణం పరిమాణాన్ని జోడించే ముందు స్థానిక చిరునామాను 32-బిట్ పూర్ణాంకంగా సంకుచితం చేస్తుంది. 64-బిట్ ప్రక్రియ సరిపోని చిరునామాలను ఉంచగలదు. మార్పిడి మరియు విలువపై ఆధారపడి ఫలితం ఓవర్ఫ్లో మినహాయింపు లేదా చెల్లని చిరునామా కావచ్చు. బిల్డ్ను x86కి తిరిగి మార్చడం లోపాన్ని దాచగలదు, కానీ ఇంటరాప్ అమలును ఆ పరిష్కారంపై ఆధారపడి ఉంచుతుంది.
చిరునామాలను పాయింటర్-పరిమాణ రూపంలో ఉంచండి. ఉదాహరణకు, ఇప్పటికే కేటాయించిన శ్రేణి గుండా వెళ్లడానికి ఇది ఉపయోగించవచ్చు:
IntPtr item = IntPtr.Add(buffer, checked(index * optionSize));
ఆఫ్సెట్ పూర్ణాంకంగానే ఉంటుంది; చిరునామా స్వయంగా దాని ద్వారా నొక్కబడదు. కేటాయింపు పరిమాణం మరియు సూచిక ఇప్పటికీ చెల్లుబాటు కావాలి.
తర్వాత చుట్టుపక్కల ప్రకటనలను పరిశీలించండి
WinINet యొక్క ప్రతి-కనెక్షన్ ఎంపికల్లో DWORD, స్ట్రింగ్ పాయింటర్ మరియు FILETIME సభ్యులుగా ఉన్న యూనియన్ ఉంటుంది. పాయింటర్ ఫీల్డ్లకు IntPtr అవసరం; DWORD ఫీల్డ్లు 32-బిట్గానే ఉంటాయి. స్థానిక అమరిక ముఖ్యం, కాబట్టి ప్రతి పూర్ణాంకాన్ని 64-బిట్ పూర్ణాంకంతో భర్తీ చేయడం లేదా ప్యాక్ చేసిన లేఅవుట్ను బలవంతం చేయడం సరైన మరమ్మతు కాదు.
శ్రేణి గుండా వెళ్లేటప్పుడు marshaling తర్వాత నిర్మాణ పరిమాణాన్ని ఉపయోగించండి, ANSI లేదా Unicode ప్రకటనను స్థిరంగా సరిపోల్చండి మరియు ప్రతి కేటాయింపును విడిగా ట్రాక్ చేయండి. ఎంపిక నిర్మాణాల బ్లాక్ను విడుదల చేయడం వేరే చోట కేటాయించిన మరియు ఆ నిర్మాణాల ద్వారా సూచించబడే స్ట్రింగ్లను స్వయంచాలకంగా విడుదల చేయదు.
చివరగా, సెట్టింగ్ల పరిధి ప్రశ్నను మెమరీ సరైనది నుండి వేరు చేయండి. కాస్ట్ మరమ్మతు చేయడం సహాయకుడు ఎంచుకున్న WinINet ఎంపిక ఒక నియంత్రణ, ఒక ప్రక్రియ లేదా ప్రస్తుత వినియోగదారు సెట్టింగ్లపై మాత్రమే ప్రభావం చూపుతుందని నిరూపించదు. పాత నమూనా మిగిలిన భాగాన్ని స్వీకరించే ముందు ఆ API ప్రవర్తనను తనిఖీ చేయండి. అది రిఫ్రెష్ నోటిఫికేషన్లను కూడా పంపుతుంటే, ఉద్దేశించిన పరిధి కోసం వాటిని ఎంచుకోండి.