Windows console OEM unicode output

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
ChrisR
Messages : 222
Inscription : sam. 14/févr./2015 16:20

Windows console OEM unicode output

Message par ChrisR »

Lire la sortie Stdout, en conservant les accents, depuis cmd.exe est un vrai casse tête, pour ceux qui ont éssayé, j'en fais partie :wink:
Donc Je pense qu'il est bon de partager la solution de fryquez, ici.

Code : Tout sélectionner

prog$ = GetEnvironmentVariable("COMSPEC")   ;cmd.exe
dosbox = RunProgram(prog$, "", "", #PB_Program_Open|#PB_Program_Read|#PB_Program_Write|#PB_Program_Hide|#PB_Program_Ascii) 

If dosbox  
  OpenWindow(0,0,0,400,500,"Results from DosBox",#PB_Window_ScreenCentered|#PB_Window_SystemMenu) 
  StartDrawing(WindowOutput(0)) 
    DrawText(65,200, "Pinging now, Stand by for results...", #Black, GetSysColor_(#COLOR_BTNFACE)) 
  StopDrawing() 
  NewList results.s() 
  WriteProgramStringN(dosbox, "ping google.com", #PB_Ascii) 
  WriteProgramData(dosbox, #PB_Program_Eof, 0) 
  While ProgramRunning(dosbox) 
    If AvailableProgramOutput(dosbox) 
      AddElement(results()) 
      
      sOEM_in_unicode.s = ReadProgramString(dosbox, #PB_Ascii) 
      iByteLength = Len(sOEM_in_unicode) + 2
      sOem_in_Ascii.s = Space(iByteLength)
      PokeS(@sOem_in_Ascii, sOEM_in_unicode, -1, #PB_Ascii)
      sUnicode.s = Space(iByteLength)
      OemToChar_(@sOem_in_Ascii, @sUnicode)
      results() = sUnicode

    Else 
      Delay(1) 
    EndIf 
  Wend 
  AddElement(results()) 
  AddElement(results()) 
  results() = "Program finished with exit code = " + Str(ProgramExitCode(dosbox)) 
  CloseProgram(dosbox) 
  
  ListViewGadget(0,0,0,400,500) 
  ForEach results() 
    AddGadgetItem(0, -1, results()) 
  Next 
  Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow 
Else 
  MessageRequester("OOPS!", "Can't find " + prog$ ) 
EndIf
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Windows console OEM unicode output

Message par Zorro »

En d'autres Termes , et moins compliqué , ça donne ceci : ;)

Code : Tout sélectionner

prg=RunProgram("cmd.exe", "/c ipconfig /all  ", "", #PB_Program_Open|#PB_Program_Read) ; la commande "ipconfig /all" est entré dans la console
If prg
		While ProgramRunning(prg)
				If AvailableProgramOutput(prg)
						sOEM_in_unicode.s = ReadProgramString(prg, #PB_Ascii)
						iByteLength = Len(sOEM_in_unicode) + 2
						sOem_in_Ascii.s = Space(iByteLength)
						PokeS(@sOem_in_Ascii, sOEM_in_unicode, -1, #PB_Ascii)
						sUnicode.s = Space(iByteLength)
						OemToChar_(@sOem_in_Ascii, @sUnicode)
						Sortie$=Sortie$+sUnicode.s+chr(10)+chr(13)
				EndIf
		Wend
		Sortie$ + Chr(10) + Chr(13)
		Sortie$ + "Code de retour : " + Str(ProgramExitCode(prg))		
		
		CloseProgram(prg) ; Ferme la connection vers le programme
EndIf
MessageRequester("Sortie", Sortie$)

; 
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: Windows console OEM unicode output

Message par Marc56 »

:idea: Variante avec visualisation temps (presque) réel avec l'astuce
While WindowEvent() : Wend
pour régénérer la listeview à chaque ajout de ligne

Code : Tout sélectionner

prog$ = GetEnvironmentVariable("COMSPEC")   ;cmd.exe
dosbox = RunProgram(prog$, "", "", #PB_Program_Open|#PB_Program_Read|#PB_Program_Write|#PB_Program_Hide|#PB_Program_Ascii)
LoadFont(0, "consolas", 10)
If dosbox 
     OpenWindow(0,0,0,600,500,"Results from DosBox",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
     WriteProgramStringN(dosbox, "ping google.com", #PB_Ascii)
     WriteProgramData(dosbox, #PB_Program_Eof, 0)
     ListViewGadget(0,0,0,600,500)
     SetGadgetFont(0, FontID(0))
     While ProgramRunning(dosbox)
          If AvailableProgramOutput(dosbox)
               sOEM_in_unicode.s = ReadProgramString(dosbox, #PB_Ascii)
               iByteLength = Len(sOEM_in_unicode) + 2
               sOem_in_Ascii.s = Space(iByteLength)
               PokeS(@sOem_in_Ascii, sOEM_in_unicode, -1, #PB_Ascii)
               sUnicode.s = Space(iByteLength)
               OemToChar_(@sOem_in_Ascii, @sUnicode)

               AddGadgetItem(0, -1, sUnicode)
               While WindowEvent() : Wend
          EndIf
     Wend
     CloseProgram(dosbox)
     Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Else
     MessageRequester("OOPS!", "Can't find " + prog$ )
EndIf 
L'idéal aussi serait de pourvoir se débarrasser de l'appel API (OemToChar_)

:wink:
Avatar de l’utilisateur
ChrisR
Messages : 222
Inscription : sam. 14/févr./2015 16:20

Re: Windows console OEM unicode output

Message par ChrisR »

Il est bon d'avoir un exemple simplifié ainsi qu'un exemple en temps réel :)
Marc56 a écrit :L'idéal aussi serait de pourvoir se débarrasser de l'appel API (OemToChar_)
Peut-être mais à la fois cmd.exe est présent uniquement sur windows.
Il n'est pas donc vraiment gênant d'utiliser une API ici.
Avatar de l’utilisateur
celtic88
Messages : 309
Inscription : sam. 12/sept./2015 14:31
Localisation : Alger

Re: Windows console OEM unicode output

Message par celtic88 »

merci c'est intéressant
.....i Love Pb :)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Windows console OEM unicode output

Message par nico »

Je trouve plus simple de passer par les pseudo-type, au départ je n'avais pas fait de procédure ConvertOEM mais je l'ai ajoutée pour que cela puisse fonctionner aussi bien en ascii et en unicode.

Code : Tout sélectionner

; Utilisation simplifiée de la console CMD en compilation Ascii ou Unicode
; afin de convertir le texte oem correctement.

Import "User32.lib"
  OemToCharW(OEM.p-ascii, Unicode.i)
  OemToCharA(OEM.s, ASCII.i)
EndImport

Procedure.s ConvertOEM(OEM.s)
  Protected NativeString.s
  
  If Len(OEM) > 0
    NativeString = Space(Len(OEM))
    If #PB_Compiler_Unicode = 1
      OemToCharW(OEM, @NativeString)
    Else
      OemToCharA(OEM, @NativeString)
    EndIf
  EndIf 
  
  ProcedureReturn NativeString
EndProcedure

prg=RunProgram("cmd.exe", "/c getmac  ", "", #PB_Program_Open|#PB_Program_Read) ; Récupération de l'@MAC
If prg
  While ProgramRunning(prg)
    If AvailableProgramOutput(prg)
      sOEM.s = ReadProgramString(prg, #PB_Ascii)
      sConsole.s = ConvertOEM(sOEM)
      Sortie$=Sortie$+sConsole+Chr(10)+Chr(13)
    EndIf
  Wend
  Sortie$ + Chr(10) + Chr(13)
  Sortie$ + "Code de retour : " + Str(ProgramExitCode(prg))      
  
  CloseProgram(prg)
EndIf
MessageRequester("Sortie", Sortie$)
Avatar de l’utilisateur
Ar-S
Messages : 9478
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Windows console OEM unicode output

Message par Ar-S »

Excellent tout ça merci à vous.
ça me changera de mes sales replacestring :mrgreen:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre