1

Тема: AHK: Проблемы с получением данных из консоли

Мне нужно выполнить команду quser. На английской винде все нормально, но на русской появляются "крякозябры". Код функции:

StdoutToVar(sCmd, sEncoding:="CP0", sDir:="", ByRef nExitCode:=0) {
    hstdoutrd:=""
	hstdoutwr:=""
	nTot:=""
	nSize:=""
	sOutput:=""
    DllCall( "CreatePipe",           PtrP,hStdOutRd, PtrP,hStdOutWr, Ptr,0, UInt,0 )
    DllCall( "SetHandleInformation", Ptr,hStdOutWr, UInt,1, UInt,1                 )


            VarSetCapacity( pi, (A_PtrSize == 4) ? 16 : 24,  0 )
    siSz := VarSetCapacity( si, (A_PtrSize == 4) ? 68 : 104, 0 )
    NumPut( siSz,      si,  0,                          "UInt" )
    NumPut( 0x100,     si,  (A_PtrSize == 4) ? 44 : 60, "UInt" )
    NumPut( hStdOutWr, si,  (A_PtrSize == 4) ? 60 : 88, "Ptr"  )
    NumPut( hStdOutWr, si,  (A_PtrSize == 4) ? 64 : 96, "Ptr"  )

    If ( !DllCall( "CreateProcess", Ptr,0, Ptr,&sCmd, Ptr,0, Ptr,0, Int,True, UInt,0x08000000
                                  , Ptr,0, Ptr,sDir?&sDir:0, Ptr,&si, Ptr,&pi ) )
        Return ""
      , DllCall( "CloseHandle", Ptr,hStdOutWr )
      , DllCall( "CloseHandle", Ptr,hStdOutRd )

    DllCall( "CloseHandle", Ptr,hStdOutWr ) ; The write pipe must be closed before reading the stdout.
    While ( 1 )
    { ; Before reading, we check if the pipe has been written to, so we avoid freezings.
        If ( !DllCall( "PeekNamedPipe", Ptr,hStdOutRd, Ptr,0, UInt,0, Ptr,0, UIntP,nTot, Ptr,0 ) )
            Break
        If ( !nTot )
        { ; If the pipe buffer is empty, sleep and continue checking.
            Sleep, 100
            Continue
        } ; Pipe buffer is not empty, so we can read it.
        VarSetCapacity(sTemp, nTot+1)
        DllCall( "ReadFile", Ptr,hStdOutRd, Ptr,&sTemp, UInt,nTot, PtrP,nSize, Ptr,0 )
        sOutput .= StrGet(&sTemp, nSize, sEncoding)
    }

    ; * SKAN has managed the exit code through SetLastError.
    DllCall( "GetExitCodeProcess", Ptr,NumGet(pi,0), UIntP,nExitCode )
    DllCall( "CloseHandle",        Ptr,NumGet(pi,0)                  )
    DllCall( "CloseHandle",        Ptr,NumGet(pi,A_PtrSize)          )
    DllCall( "CloseHandle",        Ptr,hStdOutRd                     )
    Return sOutput
}

В результате получаю это:
http://s01.geekpic.net/di-E461MB.png

Пытался указать другой "sEncoding", получил это:
http://s01.geekpic.net/di-M0PSKQ.png

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

2

Re: AHK: Проблемы с получением данных из консоли

Подставил кодировку, которую получил таким методом:

"CP" DllCall("GetOEMCP", "UInt")

... и это решило проблему.

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

3 (изменено: svoboden, 2022-04-06 05:15:32)

Re: AHK: Проблемы с получением данных из консоли

А как функция вызывается?

4

Re: AHK: Проблемы с получением данных из консоли

StdOutToVar(comspec " /c quser", "CP" DllCall("GetOEMCP", "UInt"))
Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

5 (изменено: svoboden, 2022-04-06 09:29:10)

Re: AHK: Проблемы с получением данных из консоли

Через comspec у меня ничего не работает. Только через cmd:

 MsgBox, % StdoutToVar("cmd /c quser" "CP" DllCall("GetOEMCP", "UInt"))

Но кодировка неправильная все равно.

6

Re: AHK: Проблемы с получением данных из консоли

comspec и cmd здесь лишние.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder