écrire sur stdout

Résolu
heffge - 31 déc. 2012 à 21:00
 heffge - 3 janv. 2013 à 14:49
Bonjour,

J'essaie d'écrire sur la console à l'intérieur d'un programme en VB qui lui même est prévu pour s'exécuter dans ce mode. Après quelques recherches sur la toile je suis arrivé au code suivant :

'-----------------
' Écriture console
'-----------------

Private Declare Function GetStdHandle Lib "Kernel32" (ByVal nStdHandle As Long) As Long
Private Declare Function WriteFile Lib "Kernel32" (ByVal hFile As Long, ByVal lpBuffer As String, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As Any) As Long

' Procédure principale
'---------------------
Sub Main()
Dim msg As String
Dim nb_car As Long
Dim nb_dep As Long
Dim aff As Boolean
Const STD_OUTPUT_HANDLE = -11&
msg = "Bonjour"
aff = WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), msg, Len(msg), nb_car, nb_dep)
End Sub
Après compilation je lance ce programme en mode console et rien ne se passe ! En exécution pas à pas dans l'éditeur de VB j'ai nb_car 0 et nb_dep 259 mais c'est peut-être normal puisque là je ne suis plus dans la console.

Je suppose que j'ai dû sauter quelques étapes mais lesquelles ?

Merci d'avance pour vos conseils.

FG

6 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
1 janv. 2013 à 09:58
Bonjour,
1) Je pense qu'il te faut d'abord attacher le processus appelant à une console.
2) Pourquoi utiliser WriteFile et non WriteConsole, pour ce que tu parais vouloir faire ?

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
3
Merci d'avoir répondu aussi vite.

J'aurais dû péciser que même si à diverses occasions j'ai déjà écrit quelques lignes de code en VB ou dans ses déclainaisons, VBA et VBS, je reste un débutant, notamment en ce qui concerne le maniement des API.

En ce qui concerne le point 1 j'ignore ce que tu entends par là. Il me semble que le processus appelant est déjà la console (cmd.exe) puisque c'est dans ce mode que je lance ce programme.

Pour le point 2 la raison est que je me suis inspiré de ce que j'ai trouvé sur la toile. Dans tous les exemples que j'ai vus on utilisait WriteFile. J'ai jeté un bref coup d'œil à WriteConsole et il m'a semblé que dans ce cas il fallait en plus gérer la mise en page soit-même.

Heffgé
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
1 janv. 2013 à 22:06
et il m'a semblé que dans ce cas il fallait en plus gérer la mise en page soit-même

Mise en page ?
De quelle "mise en page" s'agit-il donc ?


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
MSDN à propos de WriteConsole : Writes a character string to a console screen buffer beginning at the current cursor location

J'ai essayé mais cela ne change rien. Mon message n'apparaît à la console.

Heffgé
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
2 janv. 2013 à 11:50
Et c'est cela, que toi, tu appelles la "mise en page" ?
Ouvre ce lien
Tapez le texte de l'url ici.
Regarde le code des deux exemples.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Sauf erreur de ma part ces exemples sont pour la création d'une fenêtre console et ce n'est donc pas ce que je cherche à faire (envoyer un message sur la console à partir de laquelle j'ai lancé mon programme).

En cherchant d'avantage j'ai trouvé qu'il fallait que je fasse un linkedit avec la console :
LINK /EDIT /SUBSYSTEM:CONSOLE {your exe's filename}


J'obtiens ainsi ce que je souhaitais, et en utilisant WriteFile car WriteConsole affiche des hiéroglyphes à la place de mon texte.

Merci de t'être penché sur mon problème.

Heffgé
0
Rejoignez-nous