J'ai une application Windows qui exécute une routine simple pour déterminer si un jeton USB est présent. La méthode a toujours fonctionné correctement sur les machines 32 bits, mais lors des tests sur une machine 64 bits, nous avons commencé à voir des résultats inattendus.Taille de la structure, vérifiez si 64 bits ou 32 bits
J'appelle la méthode suivante
[StructLayout(LayoutKind.Sequential)]
internal struct SP_DEVINFO_DATA
{
public Int32 cbSize;
public Guid ClassGuid;
public Int32 DevInst;
public UIntPtr Reserved;
};
[DllImport("setupapi.dll")]
internal static extern Int32 SetupDiEnumDeviceInfo(IntPtr DeviceInfoSet, Int32 MemberIndex, ref SP_DEVINFO_DATA DeviceInterfaceData);
La documentation de la structure SP_DEVINFO_DATA nous dit que le cbSize est la taille, en octets, de la structure de SP_DEVINFO_DATA.
Si nous calculons cbSize pour une machine 32 bits, ce sera 28 et 32 pour une machine 64 bits.
J'ai testé cela sur les deux machines en recompilant avec différentes valeurs cbSize, ce que je veux savoir, c'est comment puis-je calculer cela comme runtime? Mon application doit fonctionner sur les deux architectures.
internal static Int32 GetDeviceInfoData(Int32 iMemberIndex)
{
_deviceInfoData = new Win32DeviceMgmt.SP_DEVINFO_DATA
{
cbSize = ?? // 28 When 32-Bit, 32 When 64-Bit,
ClassGuid = Guid.Empty,
DevInst = 0,
Reserved = UIntPtr.Zero
};
return Win32DeviceMgmt.SetupDiEnumDeviceInfo(_deviceInfoSet, iMemberIndex, ref _deviceInfoData);
}
Merci
Rohan
Hans, cela résout le problème de savoir comment passer dans la taille réelle, donc je suis upvoting. Cependant, je suis toujours un peu préoccupé par l'emballage. Aucun point passant la taille réelle quand c'est faux. –
@Steven - Si le tassement est incorrect, régler cbSize sur une valeur constante est en fait une très mauvaise chose à faire. Cela ne permettra pas à l'API de détecter que vous vous êtes trompé et de signaler une bonne erreur. Il va juste échouer au hasard car il va lire les ordures. –
@Hans - Cheers, fonctionne très bien! –