アプリ版:「スタンプのみでお礼する」機能のリリースについて

『Microsoft Visual Basic 2010 Express』という体験版をインストールして
独学でVisual Basic の勉強を始めてみましたが、DOSプロンプトへの
標準出力を変数・配列に代入する方法がわかりませんでしたので、お詳しい
かたがいらっしゃいましたら、お願いいたします。


<作成しているffmpegを動作させるというプログラム>

Dim Prog_path As String
Dim Dir_mini As String

Private Sub TextBox1_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragDrop

TextBox1.Text = ""
'ドロップされた内容を表示する
Dim idx() As String = e.Data.GetData(DataFormats.FileDrop, False)
Dim FileName_1 As String
Dim FileName_2 As String
Dim OutFile_mini As String

For i = 0 To idx.Length - 1

TextBox1.Text = ""
For j = i + 1 To idx.Length - 1 ' 順番待ちファイル表示の為、j = i + 1 から開始
FileName_1 = IO.Path.GetFileName(idx(j)) ' Pathを除いたファイル名の取得
TextBox1.Text = TextBox1.Text + (FileName_1 & vbNewLine)
Next

TextBox1.Refresh() ' 順番待ちファイル情報更新

FileName_2 = IO.Path.GetFileNameWithoutExtension(idx(i)) ' ファイル名の拡張子無し

'ffmpeg 実行

OutFile_mini = Dir_mini & "\" & FileName_2 & ".MP4" ' 出力Pathとファイル名
TextBox6.Text = OutFile_mini
TextBox6.Refresh() ' 処理中ファイル情報更新
CreateObject("WScript.Shell").Run(Prog_path & "\cores\ffmpeg -y -maxfr 30 -i """ & idx(i) & """ -bitexact -vcodec h264 -coder 1 -bufsize 128 -g 250 -s 160x120 -b 10 -acodec aac -ac 2 -ar 48000 -ab 64 -f mp4 """ & OutFile_mini & """", 0, True) ' 第2パラメータは0で非表示1で通常表示2で最小化3で最大化、第3パラメータはTrueで順次、Falseで前処理の終了待たず

Next

TextBox6.Text = ""
TextBox6.Refresh() ' 全て処理後、TextBox6の内容をクリア

End Sub

複数ファイルを処理する場合に単純に『Shell』を使ってしまいますと非同期で
どんどん処理されてしまいますので『CreateObject("WScript.Shell").Run』と
いうもので、処理の順番待ちをしてくれるようにしていますが、この中に書かれて
います『Prog_path & "\cores\ffmpeg"』というプログラムは、DOS窓表示を
させますと、処理の進捗状況を表示してくれます。

複数ファイルを処理するという前提で、ffmpegの実行は順番待ちをして、しかも
個々のffmpegの標準出力結果は非同期に参照をして、変数に代入をして処理する
(若しくはTextBox7などを作成して表示させる)という方法にしたいのですけれど…

A 回答 (1件)

1.Execを使う方法


結構面倒くさい
http://msdn.microsoft.com/ja-jp/library/cc364375 …

2.Processクラスでコマンドプロンプトをしっかり制御する
.netなら普通はこっち
http://www.atmarkit.co.jp/fdotnet/dotnettips/657 …

この回答への補足

ありがとうございます

デバッグ用に、ネット検索でヒットしました記述を少し変更しまして
以下のようなTextBox7に出力させるプログラムを作ってみますと動く
のですが、ffmpegを動かした場合のDOSウインドウへの標準出力は、
同じ様な方法ではダメでした。

StdOutに値が無いのか別の要因なのか、何も表示してくれません。

ffmpegの標準出力は進捗状況を表す為に、内容が逐次変更されていく
ためでしょうか

それですので、一般的な方法ではなさそうです


Dim WSH As Object, wExec As Object, sCmd As String, Result As String
WSH = CreateObject("WScript.Shell")
sCmd = "dir C:\"
wExec = WSH.Exec("%ComSpec% /c " & sCmd)

Do While wExec.Status = 0
System.Threading.Thread.Sleep(100)
Loop

Result = wExec.StdOut.ReadAll
TextBox7.Text = Result
wExec = Nothing
WSH = Nothing

補足日時:2010/09/09 18:01
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!