Una sola conversión puede convertir un asistente de configuración de proxy aparentemente normal en un fallo dependiente de la arquitectura:

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

Ese código reduce una dirección nativa a un entero de 32 bits antes de sumar el tamaño de la estructura siguiente. Un proceso de 64 bits puede contener direcciones que no caben. Según la conversión y el valor, el resultado puede ser una excepción de desbordamiento o una dirección no válida. Volver a compilar para x86 puede ocultar el error, pero deja la implementación de interoperabilidad dependiente de ese parche.

Mantenga las direcciones en forma de tamaño de puntero. Por ejemplo, para avanzar por una matriz ya asignada se puede usar:

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

El desplazamiento sigue siendo un entero; la dirección en sí no se comprime a través de uno. El tamaño de la asignación y el índice aún deben ser válidos.

Luego inspeccione las declaraciones del entorno

Las opciones por conexión de WinINet contienen una unión cuyos miembros incluyen un DWORD, un puntero a cadena y un FILETIME. Los campos de puntero necesitan IntPtr; los campos DWORD siguen siendo de 32 bits. La alineación nativa importa, así que sustituir cada entero por un entero de 64 bits o forzar un diseño empaquetado no es una reparación sólida.

Use el tamaño de la estructura tras el marshaling al recorrer la matriz, haga coincidir la declaración ANSI o Unicode de forma coherente y rastree cada asignación por separado. Liberar el bloque de estructuras de opciones no libera automáticamente las cadenas asignadas en otro lugar y referenciadas por esas estructuras.

Por último, mantenga la cuestión del alcance de la configuración separada de la corrección de la memoria. Reparar una conversión no demuestra que la opción de WinINet elegida por un asistente afecte solo a un control, un proceso o la configuración del usuario actual. Compruebe ese comportamiento de la API antes de adoptar el resto de una muestra antigua. Si además envía notificaciones de actualización, selecciónelas para el alcance previsto.

Artículos relacionados