Pam mae hen gymorthydd procsi WinINet yn torri mewn adeiladwaith 64-bit
Adnabyddwch docio pwyntwyr mewn enghreifftiau interop procsi C# ac adolygwch gynllun strwythurau a pherchnogaeth cof cyn eu hailddefnyddio.
Gall un cast droi cymorthydd gosodiadau procsi sy'n ymddangos yn gyffredin yn fethiant sy'n dibynnu ar y bensaernïaeth:
current = (IntPtr)((int)current + optionSize);
Mae'r cod hwnnw'n culhau cyfeiriad brodorol i gyfanrif 32-bit cyn ychwanegu maint y strwythur nesaf. Gall proses 64-bit ddal cyfeiriadau nad ydynt yn ffitio. Yn dibynnu ar yr addasiad a'r gwerth, gall y canlyniad fod yn eithriad gorlif neu'n gyfeiriad annilys. Gall troi'r adeiladwaith yn ôl i x86 guddio'r camgymeriad, ond mae'n gadael y gweithrediad interop yn dibynnu ar y gwaith osgoi hwnnw.
Cadwch gyfeiriadau ar ffurf maint pwyntydd. Er enghraifft, gall symud drwy arae sydd eisoes wedi'i dyrannu ddefnyddio:
IntPtr item = IntPtr.Add(buffer, checked(index * optionSize));
Mae'r atrediad yn parhau'n gyfanrif; nid yw'r cyfeiriad ei hun yn cael ei wasgu drwyddo. Mae angen i faint y dyraniad a'r mynegai fod yn ddilys o hyd.
Yna archwiliwch y datganiadau o amgylch
Mae opsiynau WinINet fesul cysylltiad yn cynnwys undeb y mae ei aelodau'n cynnwys DWORD, pwyntydd llinyn a FILETIME. Mae angen IntPtr ar feysydd pwyntydd; mae meysydd DWORD yn aros yn 32-bit. Mae aliniad brodorol o bwys, felly nid yw disodli pob cyfanrif â chyfanrif 64-bit na gorfodi cynllun wedi'i bacio yn atgyweiriad cadarn.
Defnyddiwch faint y strwythur ar ôl marshalio wrth gerdded drwy'r arae, cyfatebwch y datganiad ANSI neu Unicode yn gyson, a dilynwch bob dyraniad ar wahân. Nid yw rhyddhau bloc y strwythurau opsiynau'n rhyddhau llinynnau a ddyrannwyd yn rhywle arall ac a gyfeirir gan y strwythurau hynny yn awtomatig.
Yn olaf, cadwch gwestiwn cwmpas y gosodiadau ar wahân i gywirdeb y cof. Nid yw atgyweirio cast yn profi bod yr opsiwn WinINet a ddewiswyd gan gymorthydd yn effeithio ar un rheolydd yn unig, un broses neu osodiadau'r defnyddiwr cyfredol. Gwiriwch ymddygiad API hwnnw cyn mabwysiadu gweddill sampl hen. Os yw hefyd yn anfon hysbysiadau adnewyddu, dewiswch hwy ar gyfer y cwmpas a fwriedir.