1. DosCmd.so

DosCmd.so ライブラリは DosCommand クラスを提供します。

DosCommand クラスは、自前の DOSコンソールを使って、Windowsのいろいろなプログラムを実行します。

1. ユースケース

1.1. ユースケース（１）：コマンドの出力を取得したい。

#output_lines= と #execute2 を使うと簡単にコマンド出力を取得できます。
#execute2 はコマンド実行に成功すれば 0、失敗した場合には 0 以外を返します。

--ruby
#! ruby -Ks
require "phi"
require "DosCmd"

out = Phi::StringList.new
cmd = Phi::DosCommand.new
cmd.output_lines = out
cmd.command_line = "cmd /c dir " # +File.dirname(__FILE__).tr("/","\\")
ret = cmd.execute2
puts "###",out.to_a,"###"

require "win32/util/LastErrorMessage"
msg = Win32.last_error_message(ret)
puts "###",ret,msg,"###"
--
【実行結果】
--ruby
###
 Volume in drive G is .
 Volume Serial Number is 1246-0F62

 Directory of G:\Apollo\apollo_tk\doc\ext\DosCmd

2003/11/10  00:18    <DIR>          .
2003/11/09  23:31    <DIR>          ..
2003/11/10  00:15             3,808 DosCmd.pi
2003/11/10  00:19               352 1.rb
2003/11/10  00:18               283 1.rb.bak
               3 File(s)          4,443 bytes
               2 Dir(s)   1,201,602,560 bytes free
###
###
0
この操作を正しく終了しました。
###
--

1.1. ユースケース２：コマンドの出力をメモに出力したい。

--ruby
#! ruby -Ks
require "phi"
require "DosCmd"

form = Phi::Form.new

memo = Phi::Memo.new form
memo.align = Phi::AL_CLIENT

button = Phi::Button.new form,:button,"run"
button.align = Phi::AL_BOTTOM

edit = Phi::Edit.new form
edit.align = Phi::AL_BOTTOM
edit.text = "cmd /c dir"

cmd = Phi::DosCommand.new
cmd.output_lines = memo.lines

button.on_click = proc{
  cmd.command_line = edit.text
  cmd.execute
}

form.show
Phi.mainloop
--

1.1. ユースケース３：自前のコンソールを作る。

C:/PROGRA~1/Apollo/src/ext/doscmd/console.rb を参考にしてください。

1. DosCommand のソース

DosCommand の元のソース（maxime_collomb 氏のバージョン）は

http://www.torry.net.  の「Quick Search」で「DosCommand」を検索。
http://homepages.borland.com/torry/vcl/system/tasks/doscommand.zip

ですが、このままでは使えません。作者に連絡が取れないので、勝手にパッチを当てたものを使用します。

1. DosCommand クラス

1.1. instance methods

: ==                    => Kernel#==
: ===                   => Kernel#===
: =~                    => Kernel#=~
: __id__                => Kernel#__id__
: __send__              => Kernel#__send__
: _dump                 => Phi::Component#_dump

: active
: active?

コマンドを実行中かどうかを返す。

: class                 => Kernel#class
: clone                 => Kernel#clone

: command_line
: command_line=

実行するコマンド

: component_count       => Phi::Component#component_count
: components            => Phi::Component#components

: creation_flag
: creation_flag=

CreateProcess API 用のフラグです。

: display               => Kernel#display
: dup                   => Kernel#dup
: eql?                  => Kernel#eql?
: equal?                => Kernel#equal?

: event_handle

: execute

#command_line にセットされたコマンドを実行し、実行終了を待たずに戻る。
#output_lines= で出力先の Phi::Strings （ Memo#lines など）がセットされていれば、そこに標準出力の内容を出力する。
実行中の状態は #active?
実行終了時の状態は #exit_code で調べる。

: execute2

#command_line にセットされたコマンドを実行し、実行終了を待つ。
#output_lines= で出力先の Phi::Strings （ Memo#lines など）がセットされていれば、そこに標準出力の内容を出力する。

戻り値は
0 正常終了
0 以外、失敗。

: exit_code
: exit_code=

コマンド終了時の値。

: extend                => Phi::Persistent#extend
: freeze                => Kernel#freeze
: frozen?               => Kernel#frozen?
: hash                  => Kernel#hash
: id                    => Kernel#id

: input_to_output
: input_to_output=
: input_to_output?

コマンドへの入力を表示するかを指定する。

: inspect               => Kernel#inspect
: instance_eval         => Kernel#instance_eval
: instance_of?          => Kernel#instance_of?
: instance_variable_get  => Kernel#instance_variable_get
: instance_variable_set  => Kernel#instance_variable_set
: instance_variables    => Kernel#instance_variables
: is_a?                 => Kernel#is_a?
: kind_of?              => Kernel#kind_of?

: line_beginned
: line_beginned?

標準出力で改行直後かどうかを調べる。

: max_time_after_beginning
: max_time_after_beginning=

タイムアウトの秒数を実行開始後の秒数で指定する。

: max_time_after_last_output
: max_time_after_last_output=

タイムアウトの秒数を最後に出力した後の秒数で指定する。

: method                => Kernel#method
: methods               => Kernel#methods
: methods_for_pi        => Object#methods_for_pi

: name
: name=

: nil?                  => Kernel#nil?
: object_id             => Kernel#object_id

: on_terminate
: on_terminate=

実行を終了したときに呼ばれるイベントハンドラ。

＊　出力ごとのイベントは Memo#on_change などをご利用ください。

: output_lines
: output_lines=

コマンドの標準出力の内容を出力する Strings オブジェクトを設定する。

: priority
: priority=

CreateProcess API 用のフラグです。

: private_methods       => Kernel#private_methods

: prompting
: prompting?

入力待ちかどうかを示す。

: prop_info             => Phi::Component#prop_info
: protected_methods     => Kernel#protected_methods
: public_methods        => Kernel#public_methods
: respond_to?           => Kernel#respond_to?
: send                  => Kernel#send

: send_line

コマンドに対する入力データを送る。

: show_window
: show_window=

CreateProcess API 用のフラグです。

: since_beginning

実行開始後からの秒数

: since_last_output

最後の出力からの秒数

: singleton_methods     => Kernel#singleton_methods
: singleton_methods_for_pi  => Object#singleton_methods_for_pi

: stop

実行を停止する。

: taint                 => Kernel#taint
: tainted?              => Kernel#tainted?

: thread_status
: thread_status=

スレッドの状態。ソースでは次のような値が定義されている。

--ruby
  TDosThreadStatus = ( dtsAllocatingMemory , dtsAllocateMemoryFail ,
                       dtsCreatingPipes    , dtsCreatePipesFail    ,
                       dtsCreatingProcess  , dtsCreateProcessFail  ,
                       dtsRunning          , dtsRunningError       ,
                       dtsSuccess,
                       dtsUserAborted,
                       dtsTimeOut );
--
: to_a                  => Kernel#to_a
: to_s                  => Kernel#to_s
: type                  => Kernel#type
: untaint               => Kernel#untaint
: write_res_file        => Phi::Component#write_res_file

