Pourquoi un ancien assistant proxy WinINet casse dans une compilation 64 bits
Repérez la troncature de pointeurs dans les exemples d'interop proxy en C# et examinez la disposition des structures et la propriété de la mémoire avant de les réutiliser.
Un seul cast peut transformer un assistant de paramètres proxy apparemment ordinaire en défaillance dépendante de l'architecture :
current = (IntPtr)((int)current + optionSize);
Ce code réduit une adresse native à un entier 32 bits avant d'ajouter la taille de la structure suivante. Un processus 64 bits peut contenir des adresses qui ne tiennent pas. Selon la conversion et la valeur, le résultat peut être une exception de dépassement ou une adresse invalide. Revenir à une compilation x86 peut masquer l'erreur, mais laisse l'implémentation d'interop dépendante de ce contournement.
Conservez les adresses au format de la taille d'un pointeur. Par exemple, pour parcourir un tableau déjà alloué, on peut utiliser :
IntPtr item = IntPtr.Add(buffer, checked(index * optionSize));
Le décalage reste un entier ; l'adresse elle-même n'est pas comprimée à travers celui-ci. La taille de l'allocation et l'index doivent toujours être valides.
Inspectez ensuite les déclarations environnantes
Les options WinINet par connexion contiennent une union dont les membres incluent un DWORD, un pointeur de chaîne et un FILETIME. Les champs pointeur nécessitent IntPtr ; les champs DWORD restent sur 32 bits. L'alignement natif compte, donc remplacer chaque entier par un entier 64 bits ou forcer une disposition compactée n'est pas une réparation saine.
Utilisez la taille de structure après marshaling pour parcourir le tableau, faites correspondre la déclaration ANSI ou Unicode de manière cohérente et suivez chaque allocation séparément. Libérer le bloc des structures d'options ne libère pas automatiquement les chaînes allouées ailleurs et référencées par ces structures.
Enfin, gardez la question de la portée des paramètres distincte de la correction mémoire. Réparer un cast ne prouve pas que l'option WinINet choisie par un assistant n'affecte qu'un seul contrôle, un seul processus ou les paramètres de l'utilisateur courant. Vérifiez ce comportement de l'API avant d'adopter le reste d'un ancien exemple. S'il envoie aussi des notifications d'actualisation, sélectionnez-les pour la portée prévue.