Unha soa conversión pode converter un axudante de configuración de proxy aparentemente normal nun fallo dependente da arquitectura:

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

Ese código reduce un enderezo nativo a un enteiro de 32 bits antes de sumar o tamaño da estrutura seguinte. Un proceso de 64 bits pode conter enderezos que non caben. Segundo a conversión e o valor, o resultado pode ser unha excepción de desbordamento ou un enderezo non válido. Volver compilar para x86 pode ocultar o erro, pero deixa a implementación de interoperabilidade dependente dese parche.

Manteña os enderezos en forma de tamaño de punteiro. Por exemplo, para avanzar por unha matriz xa asignada pódese usar:

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

O desprazamento segue sendo un enteiro; o propio enderezo non se comprime a través dun. O tamaño da asignación e o índice aínda deben ser válidos.

Despois inspeccione as declaracións da contorna

As opcións por conexión de WinINet conteñen unha unión cuxos membros inclúen un DWORD, un punteiro a cadea e un FILETIME. Os campos de punteiro necesitan IntPtr; os campos DWORD seguen sendo de 32 bits. A aliñación nativa importa, así que substituír cada enteiro por un enteiro de 64 bits ou forzar un deseño empaquetado non é unha reparación sólida.

Use o tamaño da estrutura tras o marshaling ao percorrer a matriz, faga coincidir a declaración ANSI ou Unicode de forma coherente e rastree cada asignación por separado. Liberar o bloque de estruturas de opcións non libera automaticamente as cadeas asignadas noutro lugar e referenciadas por esas estruturas.

Por último, manteña a cuestión do alcance da configuración separada da corrección da memoria. Reparar unha conversión non demostra que a opción de WinINet escollida por un axudante afecte só a un control, un proceso ou a configuración do usuario actual. Comprobe ese comportamento da API antes de adoptar o resto dunha mostra antiga. Se ademais envía notificacións de actualización, seleccióneas para o alcance previsto.

Artigos relacionados