Page 1 sur 1

Windows console OEM unicode output

Publié : ven. 12/mai/2017 10:16
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

Re: Windows console OEM unicode output

Publié : ven. 12/mai/2017 10:54
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$)

; 

Re: Windows console OEM unicode output

Publié : ven. 12/mai/2017 12:17
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:

Re: Windows console OEM unicode output

Publié : ven. 12/mai/2017 12:38
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.

Re: Windows console OEM unicode output

Publié : sam. 13/mai/2017 14:43
par celtic88
merci c'est intéressant

Re: Windows console OEM unicode output

Publié : sam. 27/mai/2017 11:31
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$)

Re: Windows console OEM unicode output

Publié : sam. 27/mai/2017 12:08
par Ar-S
Excellent tout ça merci à vous.
ça me changera de mes sales replacestring :mrgreen: