AutoHotKey_Lで、標準出力を得たい……。

 以前見つけた関数だと上手く動かないことがあったのでフォーラム検索したら、もっと新しいやつを見つけた。見つけたんだが、標準出力が多いと文字化けすることが発覚。ReadFileでバイト単位で取得したデータをそのままデコードしてるせいだと思うが、AHKで文字列でないデータを操作とか苦行の予感がするので、Fileオブジェクトで文字単位で取得してごまかした。
 文字化けはなくなったが、本当にこれで問題ないのかは解らん。

; https://autohotkey.com/board/topic/54559-stdin/#entry687172

  MsgBox % sOutput := StdoutToVar_CreateProcess("tasklist /s " A_ComputerName)

StdoutToVar_CreateProcess(psCmd, psInput="", psEncoding:="CP0", psDir:="", ByRef pnExitCode:=0) {
  
  DllCall("CreatePipe", PtrP, hStdInRd, PtrP, hStdInWr, Ptr, 0, UInt, 0)
  DllCall("CreatePipe", PtrP, hStdOutRd, PtrP, hStdOutWr, Ptr, 0, UInt, 0)
  DllCall("SetHandleInformation", Ptr, hStdInRd, Uint, 1, Uint, 1)
  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(hStdInRd, si, (A_PtrSize == 4) ? 56 : 80, "Ptr")
  NumPut(hStdOutWr, si, (A_PtrSize == 4) ? 60 : 88, "Ptr")
  NumPut(hStdOutWr, si, (A_PtrSize == 4) ? 64 : 96, "Ptr")
  
  If (!DllCall("CreateProcess", Ptr, 0, Ptr, &psCmd, Ptr, 0, Ptr, 0, Int, True, UInt, 0x08000000
   , Ptr, 0, Ptr, psDir ? &psDir : 0, Ptr, &si, Ptr, &pi))
   return
   , DllCall("CloseHandle", Ptr, hStdOutWr)
   , DllCall("CloseHandle", Ptr, hStdOutRd)
   , DllCall("CloseHandle", Ptr, hStdInRd)
  
  DllCall("CloseHandle", Ptr, hStdOutWr ) ; The write pipe must be closed before reading the stdout.
  
  if (psInput != "")
   FileOpen(hStdInWr, "h", psEncoding).Write(psInput)
   DllCall("CloseHandle", "Ptr", hStdInWr)
  
  
; ################################################################################
  
  
  StdOutBuf := FileOpen(hStdOutRd, "h", psEncoding)
  StrBuf := 1
  while StrLen(StrBuf) {
   StrBuf := StdOutBuf.Read(2047)
   sOutPut .= StrBuf
  }
  
  
; ################################################################################
  
  
  DllCall("GetExitCodeProcess", Ptr, NumGet(pi, 0), UIntP, pnExitCode)
  DllCall("CloseHandle", Ptr, NumGet(pi, 0) )
  DllCall("CloseHandle", Ptr, NumGet(pi, A_PtrSize) )
  DllCall("CloseHandle", Ptr, hStdOutRd )
return sOutput
}


[PR]
by LordNoesis | 2016-02-09 20:00 | テクノロジ | Trackback | Comments(0)
トラックバックURL : http://poimono.exblog.jp/tb/25278401
トラックバックする(会員専用) [ヘルプ]
※このブログはトラックバック承認制を適用しています。 ブログの持ち主が承認するまでトラックバックは表示されません。
名前
URL
画像認証
削除用パスワード

※このブログはコメント承認制を適用しています。ブログの持ち主が承認するまでコメントは表示されません。

ブログトップ | ファンになる