Dysfonctionnement de l'API GetComputerName

Résolu
gmarquer Messages postés 15 Date d'inscription lundi 15 février 2010 Statut Membre Dernière intervention 18 septembre 2011 - 16 sept. 2011 à 01:05
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 16 sept. 2011 à 10:53
Bonjour à tous !!!!

1 : Exposé du problème
2 : Code défaillant
3 : Question
4 : Commentaires

-----------------------------------------
1 : Exposé du problème
-----------------------------------------
J'ai z'eu une drôle de surprise avec le VBA de Word 2003.

J'ai programmé tout plein de trucs sympas en VBA-Excel qui fontionnent plutôt bien et je commence à programmer des trucs et des machins avec WORD.

J'ai déjà importé sous VBA-Word quelques outils de base déjà au point sous VBA-Excel (2003 itou). Comme tout ça c'est du VBA Office, la compatibilité est totale.

En voici un qui fonctionnait très bien sous Excel et qui ne fonctionne plus sous Word. Il s'agit tout bêtement d'attraper le nom de la machine et de le ranger dans une variable globale :

------------------------------------------
2 : Code défaillant
-------------------------------------------
Function Get_Computer_Name()
Dim k as Integer

? Computer_Name est une variable String déclarée Public dans le Module Principal (Cette fonction est, elle, définie dans un Module de Service)
Computer_Name = Space(50)

' Appel à l'API donnant le nom de la machine
GetComputerName Computer_Name, 50

? Emplacement du premier caractère Chr(0)
k = InStr(Computer_Name, Chr(0))

? Si ça a marché, k ne devrait être nul
If 0 = k Then
MsgBox "Function Get_Computer_Name : Aië ! Ouille !" & vbNewLine & _
"Réponse de l'API ""GetComputerName"" dans ""Computer_Name"" :" & vbNewLine & _
"Gros no-nosse !!! Pas de \0 dans cette chaîne !!!" & vbNewLine & _
"Longueur de la chaîne et place du \0 : " & Len(Computer_Name) & ", " & k & vbNewLine & _
"Longueur de la chaîne ""trimée"" : " & Len(Trim(Computer_Name))

' Pour la suite, dans l'appelant
Computer_Name = ""
Exit Function
End If

' On lui coupe les nouilles sur le premier \0 trouvé
Computer_Name = Left(Computer_Name, k - 1)

End Function ' Get_Computer_Name
--------------------------------------------

La fonction API "GetComputerName" a été déclarée conformément à la législation en vigueur :
Public Declare Function GetComputerName Lib etc.

et la variable globale "Computer_Name" a été déclarée public string.

Dans mon cas la fonction API retourne une chaîne inchangée alors que, dans le même temps, une Application Excel utilisant EX-AC-TE-MENT la même fonction tournant sur la même machine se récupère correctement le nom de la machine !!!!

----------------------------------------------
3 : Question
----------------------------------------------

Y a-t-il un pilote dans l'avion qui ait déjà piloté ce genre taxi ???

Ou bien, si Harry Potter ou Panoramix sont des lecteurs assidus de ce forum, voudraient-ils avoir la gentillesse de faire usage de leur baguette magique ???

----------------------------------------------
4 : Commentaires Note
----------------------------------------------
Il peut vous paraître curieux de voir une fonction qui ne retourne pas de résultat. (Hé !!! On a bien les fonctions void en C !!!). J'aurais pu la définir en "Sub" publique parce qu'elle est utilisée dans plusieurs Modules. C'est le seul moyen que j'ai trouvé pour que des Sub/Functions "Public" de service de bas niveau n'apparaissent pas dans la liste de macros affichée par F8.

3 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 sept. 2011 à 10:16
Je ne veux par ailleurs certes pas de décourager dans tes acrobaties diverses, mais regarde ce que fait cette seule ligne de code (sans tout le tien) :
 MsgBox Environ("COMPUTERNAME")



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 sept. 2011 à 08:31
Bonjour,
tout cela me parait bien embrouillé pour que je tente d'y voir claire de bon matin, surtout en présence d'un code non indenté :
complète plutôt très simplement ces lignes
1) ma variable computer_Name est déclarée dans ... ainsi .....
2) ma fonction GetComputerName de l'API de Windows est déclarée dans .... ainsi ....
3) ma fonction Get_Computer_Name se trouve dans ..... et la voici (dans son intégralité, depuis sa ligne de déclaration jusqu'à End Function)
.........
.........
........
nettoie-la de ses commentaires

4) ma variable computer_Name est définie à ..... tel moment ..... par l'appel de ma fonction Get_Computer_Name
5) je sollicite la valeur de ma variable computer_name à ...... tel autre moment .....

Pour ton info :
- telle que tu l'as écrite, ta "fonction" Get_Computer_Name n'est jamais qu'une procédure (routine non une fonction)
- je viens d'utiliser sous word, de différentes manières (à travers "fonction" tremplin ou non) la fonction dénoncée de l'Api de Windows ===>> j'ai toujours bon, y compris en utilisant un mécanisme (bizarre) ressemblant au tien.

J'en déduis que ce qui ne va pas, c'est ton mic-mac entre variables, "fonction", moment de lancement de la fonction, moment de lecture du contenu de la variable.... et non la fonction GetComputeName !

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 sept. 2011 à 10:53
Bien.
Et pour te montrer maintenant que la fonction GetComputerName de l'Apui de Woindows n'était pas incriminée (et comment aurait-elle pu l'être ?) ===>> la preuve, s'il enj fallait une :
Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Private Sub CommandButton1_Click()
    MsgBox Get_Computer_Name
End Sub

Function Get_Computer_Name() As String
    Get_Computer_Name = Space(50)
    GetComputerName Get_Computer_Name, 50
    Get_Computer_Name = Left(Get_Computer_Name, 50)
End Function


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Rejoignez-nous