windowsのアプリケーションに対して、(unixの様に)標準入出力を(ファイルではなく)直接渡すことはできるのでしょうか?

もし可能なら、VB(VBA)でのサンプルコードなど記して頂けると助かります。
(unixの記憶自体かなり曖昧なので変な質問になってしまっているかもしれませんが、ご容赦願います。)

回答の条件
  • 1人2回まで
  • 登録:2008/10/03 00:09:28
  • 終了:2008/10/04 23:19:52

ベストアンサー

id:ku__ra__ge No.6

ku__ra__ge回答回数118ベストアンサー獲得回数402008/10/04 05:52:47

ポイント40pt

ExcelVBAのサンプルです。

windowsに標準で付属しているsort.exeに対して、標準入力で並び替えしたいアイテムリストを渡し、標準出力でそれを受け取っています。

Sub StdInOut_Sample()
    Dim oWShell As Object
    Dim oExec As Object
    Dim sInput As String
    Dim sOutput As String

    Set oWShell = CreateObject("WScript.Shell")

    sInput = ""
    sInput = sInput & "blueberry" & vbCrLf
    sInput = sInput & "grape" & vbCrLf
    sInput = sInput & "cherry" & vbCrLf
    sInput = sInput & "banana" & vbCrLf
    sInput = sInput & "apple" & vbCrLf
    sInput = sInput & "lemon" & vbCrLf
    
    Set oExec = oWShell.Exec("sort.exe")
    oExec.StdIn.Write sInput
    oExec.StdIn.Close
    Do While oExec.Status = 0: DoEvents: Loop
    sOutput = oExec.StdOut.ReadAll
    
    MsgBox sOutput
End Sub
id:oich

ご回答ありがとうございました。

私が望んでいたものに相当近く、試してみたところうまく動きました。

これから詳細を勉強・理解しようと思います。

適切なご回答ありがとうございました。

2008/10/04 23:17:59

その他の回答(5件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402008/10/03 00:25:28

ポイント20pt

サンプルコードは VB ではないですが、パイプを使うのが多いでしょうかね。

Nの覚書

id:oich

パイプの概念はわかるのですが、VBでの実装が可能なのか不可能なのか、というのが知りたかったです。

質問文の書き方が悪かったですね。ごめんなさい。

2008/10/03 00:33:53
id:ardarim No.2

ardarim回答回数892ベストアンサー獲得回数1422008/10/03 04:11:43

ポイント20pt

Console クラス (System)を使って、標準入出力にアクセスすることが可能です。

上記のページよりサンプルを引用。

Public Shared Sub Main()
    Console.Write("Hola ")
    Console.WriteLine("Mundo!")
    Console.WriteLine("What is your name: ")
    Dim name As String = Console.ReadLine()
    Console.Write("Buenos Dias, ")
    Console.Write(name)
    Console.WriteLine("!")
End Sub 'Main

もちろん、パイプと組み合わせて使うことも可能です。


VBAの場合は、そもそもGUIであるExcelなどのアプリケーション内で動作するため、標準入出力と組み合わせることはできないと思われます。

(理論的には可能でしょうが、使い勝手などに制約があると思います)

id:oich

本当に質問文が不適切で申し訳ないです。

VBA上でシェル関数を使って、

ProcID = Shell(アプリケーションのフルパス, vbHide)

などとしてプロセス実行する際の入出力を、(指定したファイル名ではなく)変数と直接受け渡しできるならその方法を知りたい、と思っていました。

Consoleクラスとその周辺を勉強してみようと思います。ありがとうございました。

2008/10/03 11:01:21
id:thrillseeker No.3

thrillseeker回答回数328ベストアンサー獲得回数372008/10/03 00:59:21

ポイント20pt

CGI 用ですが、以下のコードが参考になるかも知れません。

http://www.taquino.net/cooltaq/vbcgi/stdio.html

id:oich

教えて頂いたページを基に勉強してみようと思います。ありがとうございました。

2008/10/03 11:02:07
id:ardarim No.4

ardarim回答回数892ベストアンサー獲得回数1422008/10/03 18:50:58

ポイント20pt

VBA上から、Shell()で起動したアプリケーションの標準入出力を制御することはできません。


Win32 APIであれば、あらかじめパイプを用意しておき、CreateProcessでアプリケーションを起動する際に標準入出力を代替するパイプを指定することができますので、そのパイプを通じて起動したアプリケーションの標準入出力を制御できます。

コンソール プロセスを生成して標準ハンドルをリダイレクトする方法

VBAからでも、Declareなどを駆使すれば同様のことはできる可能性がありますが、難しいと思います。


VB.NETの場合は、Process.ProcessStartInfo.RedirectStandardOutputをTrueにしてからアプリケーションを起動することで、Process.StandardOutputから標準出力の内容を受け取ることができます。(こちらは比較的簡単です)

ProcessStartInfo.RedirectStandardOutput プロパティ (System.Diagnostics)

サンプル

compiler.StartInfo.FileName = "csc.exe"
compiler.StartInfo.Arguments = "/r:System.dll /out:sample.exe stdstr.cs"
compiler.StartInfo.UseShellExecute = False
compiler.StartInfo.RedirectStandardOutput = True
compiler.Start()

Console.WriteLine(compiler.StandardOutput.ReadToEnd())

compiler.WaitForExit()
id:oich

ご回答ありがとうございました。

頂いた情報やリンクをもとにいろいろ勉強してみます。

2008/10/04 23:09:31
id:hirotie No.5

hirotie回答回数25ベストアンサー獲得回数12008/10/03 19:40:18

ポイント20pt

command関数を使えば出来ませんか?

この関数でアプリケーションとともに入力された引数を取得できないでしょうか?

ProcID = Shell("アプリケーションのフルパス 引数", vbHide)

などとすれば呼び出されたアプリはcommand関数で引数を取得できるとおもいます。

CmdLine = Command()

とすれば変数「CmdLine」へは「引数」が格納されます。

id:oich

ご回答ありがとうございました。

command関数は初耳で、情報のご提供自体はありがたいのですが、望んでいた「標準入出力の受け渡し」とはちょっと違うようでした。

2008/10/04 23:13:43
id:ku__ra__ge No.6

ku__ra__ge回答回数118ベストアンサー獲得回数402008/10/04 05:52:47ここでベストアンサー

ポイント40pt

ExcelVBAのサンプルです。

windowsに標準で付属しているsort.exeに対して、標準入力で並び替えしたいアイテムリストを渡し、標準出力でそれを受け取っています。

Sub StdInOut_Sample()
    Dim oWShell As Object
    Dim oExec As Object
    Dim sInput As String
    Dim sOutput As String

    Set oWShell = CreateObject("WScript.Shell")

    sInput = ""
    sInput = sInput & "blueberry" & vbCrLf
    sInput = sInput & "grape" & vbCrLf
    sInput = sInput & "cherry" & vbCrLf
    sInput = sInput & "banana" & vbCrLf
    sInput = sInput & "apple" & vbCrLf
    sInput = sInput & "lemon" & vbCrLf
    
    Set oExec = oWShell.Exec("sort.exe")
    oExec.StdIn.Write sInput
    oExec.StdIn.Close
    Do While oExec.Status = 0: DoEvents: Loop
    sOutput = oExec.StdOut.ReadAll
    
    MsgBox sOutput
End Sub
id:oich

ご回答ありがとうございました。

私が望んでいたものに相当近く、試してみたところうまく動きました。

これから詳細を勉強・理解しようと思います。

適切なご回答ありがとうございました。

2008/10/04 23:17:59

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません