Comment savoir si l'utilisateur est sous XP ou Seven?

YANN-56

XLDnaute Barbatruc
Bonsoir à tous, ou Bonjour suivant l'heure,

J'utilise "GetDetailsOf" pour dresser la liste des propriétés résumées d'un document Word.
(Ce qui est du même tonneau pour un Excel)

Comme le sujet de la discussion ci-dessous le démontre:
https://www.excel-downloads.com/thr...ent-2-le-2-nest-pas-le-meme-chez-tous.153645/

Les n° d'Items sont différents!

J'ai pensé palier ce problème en adaptant mon code suivant le "Windows" utilisé.

Mais malgré moult recherches, je ne parviens pas à pomper son identité.

Mon application étant utilisée en réseau avec des versions différentes; c'est le désordre!

Si quelqu'un a une idée; je lui serai très reconnaissant.

Merci par avance,

Yann
 

david84

XLDnaute Barbatruc
Re : Comment savoir si l'utilisateur est sous XP ou Seven?

Re LoneWolf
permets-moi d'insister au risque de te sembler lourd mais j'insiste parce que je pense que c'est là que se situe le noeud du problème : quand tu me dis
Écran non tactile HP avec Excel 2007 - 64Bits
64 bit ne peut être que le nombre de bits du système d'exploitation de ton ordinateur et non de la version Office vu que la version 64 bit d'Office n'est disponible que depuis 2010.
Donc quand tu me dis après
Portable Acer avec Excel 2010 64Bits.
, je pense que là encore tu me fournis le nombre de bits du système d'exploitation de ton ordinateur et non de la version Office installée sur ton ordinateur.
Pour savoir si ton Office 2010 est en version 32 ou 64 bits, ouvre s'il te plaît le dernier fichier que Yann a déposé dans son message 105 et dis-moi s'il plante à l'ouverture, et si oui quelles lignes plantent.
Merci
A+
 

JNP

XLDnaute Barbatruc
Re : Comment savoir si l'utilisateur est sous XP ou Seven?

Re :),
Pas tout suivi, avec la modification proposée par David, ton fichier fonctionne bien sous 2010 64 bits :rolleyes:...
C'est sous 2003 qu'il ne fonctionne pas :confused: ?
Bonne soirée :cool:
PS : les lignes rouges (entourées de #If) ne perturbe pas le fonctionnement, c'est juste un signalement visuel ;)...
 

Pièces jointes

  • UN.xls
    62 KB · Affichages: 114
  • UN.xls
    62 KB · Affichages: 114
  • UN.xls
    62 KB · Affichages: 115

david84

XLDnaute Barbatruc
Re : Comment savoir si l'utilisateur est sous XP ou Seven?

Re
@Yann : dis-moi si le fichier joint plante.
A+
Edit : bonsoir Jean-Noël:), mêmes modifications à première vue.
Re Edit : fichier testé sur Excel 2007 et sur Excel 2010 64 bits (il fonctionne sur les 2).
 

Pièces jointes

  • Yann_56.xls
    54.5 KB · Affichages: 113
Dernière édition:

david84

XLDnaute Barbatruc
Re : Comment savoir si l'utilisateur est sous XP ou Seven?

Re
LoneWolf : donc si comme tu le dis (ou plutôt comme tu ne le dis pas !) le fichier ne plante pas dès l'ouverture avec une belle fenêtre qui s'affiche et qui te signale une erreur de compilation et qui te dis que
"Le code contenu dans ce projet doit être mis à jour pour pouvoir être utilisé sur les systèmes 64 bits.
Vérifiez et mettez à jour les instruction Declare, puis marquez-les avec l'attribut PtrSafe."
, c'est que la version 2010 d'Office installée sur ton ordinateur est celle en 32 bits (celles installée "par défaut" lors de l'installation), et non la version 64 bits.

Les tests ramenés sur ce fil (et dont je remercie les participants) sont donc concordants (même si d'autres tests effectués par des utilisateurs des versions 32 et 64 bits d'Office 2010 seraient les bienvenus) et montreraient si cela était avéré que les macros proposées sur ce fil, notamment celles utilisant WMI ramènent le type du système d'exploitation de l'ordinateur, soit 64 bits lorsque le SE est Seven.

Par contre, Application.OperatingSystem ramènerait la version d'Office installée sur l'ordinateur.
Or, sur la version 2010, celle-ci peut être la version 32 bits ou 64 bits, d'où les résultats parfois contradictoires entre les résultats ramenés par les différentes macros.

Si ce que j'avance est correct, cela voudrait notamment dire que si, pour une raison quelconque, on voudrait utiliser un test préalable pour faire ou non fonctionner une macro uniquement sur une version d'Office 2010 en 32 bits et non en 64 bits, on pourrait faire ce test avec Application.OperatingSystem (qui ramène la version "bit" d'Office) et non des codes utilisant WMI (ou d'autres) qui eux ramènent la version bit du système d'exploitation de l'ordinateur et non de la version d'Office installée (attention, je ne parle pas de la déclaration d'API où la procédure à adopter est celle préconisée dans mes messages à l'intention de Yann).
A+
 
Dernière édition:

Lone-wolf

XLDnaute Barbatruc
Re : Comment savoir si l'utilisateur est sous XP ou Seven?

Re david,

oui, c'est bien les versions 32bits.

Maintenant dans ce code:

Code:
Private Sub UserForm_Initialize()
Dim objWMIService, objOS, colOSes, ObjC
Dim StrResults$, TotRam&
Application.ScreenUpdating = False
     Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
     Set colOSes = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
     Set colProcessors = objWMIService.ExecQuery("Select * from Win32_Processor")
     Set colSettings = GetObject("winmgmts:").InstancesOf("Win32_OperatingSystem")

     On Error Resume Next
     For Each objProcessor In colProcessors
     For Each objOS In colOSes
     For Each ObjC In colSettings
     TotRam = Round(((ObjC.TotalVisibleMemorySize / 1024) / 1024), 0)

     StrResults = StrResults & " Nom de l'ordinateur :  " & objOS.CSName & vbCrLf & vbCrLf
     StrResults = StrResults & " Edition :  " & objOS.Caption & vbCrLf & vbCrLf
     StrResults = StrResults & " Copyright " & Chr(169) & " 2009 " & objOS.Manufacturer & "." & " Tous droits réservés." & vbCrLf & vbCrLf
     StrResults = StrResults & " Version :  " & objOS.Version & vbCrLf & vbCrLf
     StrResults = StrResults & " Processeur :  " & objProcessor.Name & Chr(32) & " - " & objOS.OSArchitecture & vbCrLf & vbCrLf
     StrResults = StrResults & " Mémoire (RAM) installée:  " & TotRam & ".00" & " Go" & vbCrLf & vbCrLf
     StrResults = StrResults & " Service Pack : " & " Service Pack " & objOS.ServicePackMajorVersion
     Next
     Next
     Next
     Me.Lb_WMI.Caption = StrResults
     Application.ScreenUpdating = False
End Sub

ces lignes:

Set colOSes = objWMIService.ExecQuery("Select * from Win32_OperatingSystem") et TotRam = Round(((ObjC.TotalVisibleMemorySize / 1024) / 1024), 0)<------- sont erronées, puisque j'utilise du 32bits.
Ou c'est tout le code qui est faux??


Dans ce cas, qu'elles lignes faut écrire pour avoir le résultat juste chez tout le monde?
Faut'il faire deux codes distincts pour les 32 et 64 bits??

Très bonne nuit. :cool:

Amicalement
Lone-wolf



A
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : Comment savoir si l'utilisateur est sous XP ou Seven?

Re
ces lignes: Set colOSes = objWMIService.ExecQuery("Select * from Win32_OperatingSystem") et TotRam = Round(((ObjC.TotalVisibleMemorySize / 1024) / 1024), 0) sont erronées, puisque j'utilise du 32bits.
Ou c'est tout le code qui est faux??
Je n'est pas testé ton code et je ne connaissais pas WMI avant l'ouverture de ce fil (je remercie d'ailleurs staple pour les liens qui mon faits découvrir WMI) donc je ne sais pas si je pourrai t'aider.
Si tu veux ramener la RAM de l'ordinateur, teste ceci (issu des liens indiqués par staple) :
Code:
Sub RAM()
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")
Set colSettings = objWMIService.ExecQuery _
    ("Select * from Win32_ComputerSystem")
For Each objComputer In colSettings
    MsgBox "Total Physical Memory: " & _
        objComputer.TotalPhysicalMemory & " octets"
Next
End Sub
Si ce n'est pas ce que tu veux, précise quelle info tu recherches exactement.
Dernière précision concernant mon message précédent : je ne dis pas qu'on peut pas capter la version "bit" de la version d'Office installée sur l'ordinateur avec WMI, mais je dis que ce ne sont pas les propriétés utilisées jusqu'à présent qui permettent de le faire.
Si elles existent avec WMI, il faut donc trouver les bonnes.
A+
 
Dernière édition:

YANN-56

XLDnaute Barbatruc
Re : Comment savoir si l'utilisateur est sous XP ou Seven?

Bonsoir David, et à ceux qui passeront par là,

Le fichier fonctionne sans plantage avec mon 2003.
Comme tu m'as dit qu'il fonctionnait chez toi avec 2010 en 64Bits; tout est parfait.

J'avais seulement été effrayé par ces lignes en rouge!
La précision de JNP me rassure, en s'ajoutant à ton aide efficace.

Je ne doute que ce code est aussi accepté par la version 2010 en 32Bits.

Qu'il a été bon de tous vous avoir rencontrés ici!!!!!!!!

Merci encore, je suis comblé.

Yann

P.S.
Vous l'avez certainement, mais je joins, pour ceux qui ne l'ont pas, de PDF fort instructif sur le sujet.
 

Pièces jointes

  • vba64bits.pdf
    229.5 KB · Affichages: 179

Lone-wolf

XLDnaute Barbatruc
Re : Comment savoir si l'utilisateur est sous XP ou Seven?

Bonjour à tous,

@david

Je veux simplement afficher certaines infos qui sont dans; Ordinateur > Propriétés > Informations système générales.

Dont la RAM qui est installée: 4.00 Go (3.75 Go utilisable).

Dans mon fichier il n'y a rien d'autre que le code donné dans mon poste précédent.


Maintenant j'ai modifié le code que tu m'a donné:

Code:
Sub RAM()
Dim TotRam&
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")
Set colSettings = objWMIService.ExecQuery _
    ("Select * from Win32_ComputerSystem")
For Each objComputer In colSettings
TotRam = Round((((objComputer.TotalPhysicalMemory / 1024) / 1024) / 1000), 0)
    MsgBox "Total Physical Memory: " & TotRam & " Go"
Next
End Sub

Qu'est-ce que ça donne en 64bits?


A+:cool:

Amicalement
Lone-wolf
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : Comment savoir si l'utilisateur est sous XP ou Seven?

Re
@LoneWolf :
Qu'est-ce que ça donne en 64bits?
réponse : 6 Go.
La réponse est correcte mais pourquoi ce calcul pour y arriver (diviser 2 fois par 1024 puis encore par 1000) ?
Si c'est simplement pour obtenir cette donnée en Go, il y a sûrement plus simple, donc je me dis qu'il y a une autre raison...

@Yann56 :
Le fichier fonctionne sans plantage avec mon 2003.
Comme tu m'as dit qu'il fonctionnait chez toi avec 2010 en 64Bits; tout est parfait.

Mon cher Yann, je te signale que je t'avais déjà donné la réponse au message #69 :
Donc, en utilisant la constante VBA7 pour régler le problème de compatibilité entre les versions 2010 64 bits et les versions Office antérieures, ta déclaration des API donnerait :
Code :
#If VBA7 Then
Declare PtrSafe Function GetWindowLongA Lib "User32" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Declare PtrSafe Function SetWindowLongA Lib "User32" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare PtrSafe Function FindWindowA Lib "User32" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare PtrSafe Function DrawMenuBar Lib "User32" (ByVal hWnd As Long) As Long
#Else
Declare Function GetWindowLongA Lib "user32" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Declare Function SetWindowLongA Lib "user32" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function FindWindowA Lib "user32" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long
#End If
Chez moi cela fonctionne.
A toi de faire de même pour l'autre API placée dans RECHERCHE_OS et de compléter si nécessaire avec la constante Win64.
A+
 

Lone-wolf

XLDnaute Barbatruc
Re : Comment savoir si l'utilisateur est sous XP ou Seven?

Bonjour david,

Le code que tu m'a proposé m'affiche plus de 4 milliards d'octets. En incluant cette opération, on divise ceux-ci pour avoir des Go. J'ai pris cet exemple à partir du fichier de Michel_XLD que JCGL à mis en ligne.

Voici un petit extrait:

Code:
Option Explicit
Type MEMORYSTATUS
dwLength As Long
dwMemoryLoad As Long
dwTotalPhys As Long
dwAvailPhys As Long
dwTotalPageFile As Long
dwAvailPageFile As Long
dwTotalVirtual As Long
dwAvailVirtual As Long
End Type

Declare Sub GlobalMemoryStatus Lib "kernel32" (lpBuffer As MEMORYSTATUS)
Declare Function GetComputerName& Lib "kernel32" Alias "GetComputerNameA" (ByVal lbbuffer As String, nSize As Long)

Function GetRamSize() As String
Dim RamStats As MEMORYSTATUS
GlobalMemoryStatus RamStats
'pour compatibilité Excel 97
GetRamSize = Application.WorksheetFunction.Round(((RamStats.dwTotalPhys / 1024) / 1024) + 1, 0)
'sinon :
GetRamSize = Round((RamStats.dwTotalPhys / 1024) / 1024) + 1
End Function

Tu trouvera le fichier en question à la page 6 pour voir tout le code au complet.

A+ :cool:

Amicalement
Lone-wolf
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : Comment savoir si l'utilisateur est sous XP ou Seven?

Re
Le code que tu m'a proposé m'affiche plus de 4 milliards d'octets. En incluant cette opération, on divise ceux-ci pour avoir des Go.
Le code de départ est fait pour obtenir des Mégaoctets à partir du résultat initial ramené en octets, donc ok , mais comme tu voulais obtenir directement des Gigaoctets, je pense qu'il y a plus simple mais l'important est que cela fonctionne (et puis peut-être que j'ai tort...).

@Jean-Claude : j'ai testé le fichier de Michel XLD et il plante sévère sur Excel 2010
64 bits.
J'ai repris certaines déclarations au niveau des API et de certaine déclaration de variables et maintenant il ne plante plus que sur l'extraction de l'adresse IP du poste (je pense que c'est un problème de compatibilité au niveau de la déclaration des variables typées mais pour l'instant je ne trouve pas la parade).
De plus, il n'est plus à jour au niveau des différents types de système (la sub AfficherVersionOS ne ramène pas le SE Windows Seven par exemple que j'ai dû rajouter de mon côté).

Ceci dit, maintenant que staple m'a fait découvrir WMI, je pense qu'il est peut-être plus sécurisant de passer par WMI car il n'y a pas besoin d'utiliser des API Windows, et donc pas de risque de plantage à cause des différentes versions 32 et 64 bits. Tu peux non seulement avoir les infos que les macros de MichelXLD et Consors ramènent, mais d'autres encore, sans compter les autres possibilités qu'offrent WMI :
WMI permet d'accéder aux ressources d'un ordinateur sous Windows, les configurer, les gérer et les interroger.
Ce qui sous entend la possibilité de gérer une machine, y faire exécuter un programme, arrêter un service, la rebooter ou l'arrêter, voir les ressources system, vous abonner à un événement et recevoir une alerte, interroger le service WMI d'une application (vous pouvez aussi écrire une application offrant un serveur WMI) etc.

Avec WMI vous accédez à tout ceci sans passer par les API, ainsi les développeurs n'ont pas besoin de connaître plusieurs API pour créer des applications puissantes ou interroger les composants de la machine hôte de leur application.
Combien de fois avez-vous vu sur les news group la question : " Comment connaître le numéro de série d'un disque dur " ?

De plus l'accès ne se limite pas à la machine où s'exécute le logiciel ou le script.
On peut aussi interroger un ordinateur situé sur le réseau ou tous les ordinateurs d'un même groupe de travail.
Pratique pour un administrateur réseau pour suivre son parc machine, le surveiller, recevoir des alertes, diagnostiquer, rebooter une machine distante ou même la stopper etc..
Par contre c'est vrai que le traitement est sûrement plus lent via WMI.
A+
 

david84

XLDnaute Barbatruc
Re : Comment savoir si l'utilisateur est sous XP ou Seven?

Bonjour,
@Jean-Claude : ci-joint le fichier de MichelXLD. Il fonctionne maintenant correctement sur Excel 2010 64 bits et est apparemment compatible avec les versions antérieures (testé sur la version 2007 uniquement).
Reste à le tester sur Excel 2010 32 bits et sur 2003.

@tous : si ce fichier plante chez vous, merci de m'en faire part en m'indiquant votre version d'Excel et quelles sont les lignes de code qui posent problème.
A+
 

Pièces jointes

  • Informations PC_MichelXLD.xls
    149.5 KB · Affichages: 109
  • Informations PC_MichelXLD.xls
    149.5 KB · Affichages: 115
  • Informations PC_MichelXLD.xls
    149.5 KB · Affichages: 112

Statistiques des forums

Discussions
311 721
Messages
2 081 927
Membres
101 842
dernier inscrit
seb0390