C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: アプリから別のアプリケーションを実行する


(過去ログ 113 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■66823 / inTopicNo.1)  アプリから別のアプリケーションを実行する
  
□投稿者/ YM (3回)-(2013/05/29(Wed) 18:08:20)

分類:[VB.NET/VB2005 以降] 

VB6から、.Net2008に移行していますが、

Shell(My.Application.Info.DirectoryPath & "\Test.exe " & strPassWord & "#" & strCD & "#" & strID & "#" & strNo, AppWinStyle.NormalNoFocus)

上記のようなVB6のShell関数をProcess クラスを使って引数を引き渡したいのですが「指定されたファイルが見つかりません。」というエラーが出ます
引き渡し方が悪いのでしょうか?

Dim prc As New System.Diagnostics.Process()
prc.StartInfo.FileName = "Test.exe" & strPassWord & "#" & strCD & "#" & strID & "#" & strNo
'起動する
prc.Start()

又、Test側もどうやって、引数を受け取っていいのかわかりません
やはり、フォーム_Loadでしょうか?


よろしくお願いします

引用返信 編集キー/
■66824 / inTopicNo.2)  Re[1]: アプリから別のアプリケーションを実行する
□投稿者/ Hongliang (56回)-(2013/05/29(Wed) 19:44:31)
引数は、FileNameプロパティとは別にArgumentsプロパティに設定して下さい。

> 又、Test側もどうやって、引数を受け取っていいのかわかりません
> やはり、フォーム_Loadでしょうか?

Environment.GetCommandLineArgsメソッドなどが使えると思います。
いつ取得するかは好きにして良いです。
引用返信 編集キー/
■66826 / inTopicNo.3)  Re[1]: アプリから別のアプリケーションを実行する
□投稿者/ 魔界の仮面弁士 (229回)-(2013/05/29(Wed) 22:06:32)
No66823 (YM さん) に返信
> Shell(My.Application.Info.DirectoryPath & "\Test.exe " & strPassWord & "#" & strCD & "#" & strID & "#" & strNo, AppWinStyle.NormalNoFocus)

たとえば Shell("C:\Program Files\Sample\Test.exe pass#word#123#456", AppWinStyle.NormalNoFocus) の場合、
引数に渡した文字列は「C:\Program Files\Sample\Test.exe pass#word#123#456」を意味します。

この場合
(1)「C:\Program Files\Sample\Test.exe」を実行して「pass#word#123#456」を渡す
(2)「C:\Program」を実行して「Files\Sample\Test.exe pass#word#123#456」を渡す
(3)「C:\Program Files\Sample\Test.exe pass#word#123#456」を実行して何も渡さない
のいずれかが曖昧になってしまいます。

普通に考えれば 1 の動作となることが期待されますが、もしも C:\Program Files\Sample\ 内に
「notepad.exe pass#word#123#456.exe」が配置されていれば 3 として処理されますし、
あるいは「C:\Program.exe」があれば、2 の動作になってしまいます。

そのため、空白を含んでいる場合には、
 Shell("""C:\Program Files\Sample\Test.exe"" pass#word#123#456", AppWinStyle.NormalNoFocus)
のように、パスの前後を「"」で囲むことが望ましいです。


> Process クラスを使って引数を引き渡したいのですが
Process の場合は、既に Hongliang さんが回答されていますように、
ファイル名と引数を別々に指定することになります。

例えば、
 Dim prc As Process = Process.Start("C:\Program Files\Sample\Test.exe", "pass#word#123#456")
であるとか、
 Dim si As New ProcessStartInfo("C:\Program Files\Sample\Test.exe")
 si.Arguments = "pass#word#123#456"
 Dim prc As Process = Process.Start(si)
とか
 Dim prc As New Process()
 Dim si As ProcessStartInfo = prc.StartInfo
 si.FileName = "C:\Program Files\Sample\Test.exe"
 si.Arguments = "pass#word#123#456"
 prc.Start()
などといった具合です。


>「指定されたファイルが見つかりません。」というエラーが出ます
> prc.StartInfo.FileName = "Test.exe" & strPassWord & "#" & strCD & "#" & strID & "#" & strNo
ということで、『ファイル名と引数を別々に指定すべし』というのが回答なのですが、
それを差し引いて考えても、上記は exe の後ろに空白が含まれていませんので、
どちらにせよ NG でしょうね。(^^;

> 又、Test側もどうやって、引数を受け取っていいのかわかりません
(案1) Main メソッドの引数から取得する。
(案2) 「Dim s As String = Command()」を利用する。
(案3) My.Application.CommandLineArgs を利用する。
(案4) Environment.CommandLine を利用する。
(案5) Environment.GetCommandLineArgs を利用する。


なお、もしも引数が空白等で区切られていた場合、
String 型で受け取るもの(2、4)は、空白も含めた引数全体が渡されます。

String 配列で受け取るもの(1, 5)は、それぞれ区切られてから渡されます。
3 も同様に、区切られて ReadOnlyCollection(Of String) に渡されます。


http://dobon.net/vb/dotnet/programing/commandline.html
http://msdn.microsoft.com/ja-jp/library/ms235406.aspx
引用返信 編集キー/
■66851 / inTopicNo.4)  Re[2]: アプリから別のアプリケーションを実行する
□投稿者/ YM (4回)-(2013/05/31(Fri) 10:57:20)

渡す方
Dim prc As New Process()
Dim si As ProcessStartInfo = prc.StartInfo
si.FileName = "Test.exe"
si.Arguments = strPassWord & "#" & strCD & "#" & strID & "#" & strNo
prc.Start()


受け取る方
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

       'コマンドラインを配列で取得する
   Dim cmds() As String = System.Environment.GetCommandLineArgs()
   For Each cmd As String In cmds
   Console.WriteLine(cmd)
   Next
    End Sub


上記のコーディングで実行しましたが、『Test.exe』しか受け取っていくれません。
strPassWord & "#" & strCD & "#" & strID & "#" & strNo は受け取れません

どこか問題があるのでしょうか?

また、受け取り側をデバックしたいのですが、渡す側がexeをキックしているから無理でしょうか?


よろしくお願いします




引用返信 編集キー/
■66853 / inTopicNo.5)  Re[3]: アプリから別のアプリケーションを実行する
□投稿者/ shu (330回)-(2013/05/31(Fri) 12:00:34)
2013/05/31(Fri) 12:01:27 編集(投稿者)

No66851 (YM さん) に返信
> 受け取る方
>    Console.WriteLine(cmd)
WinFormアプリだと統合環境外での実行時はコンソール出力の表示がないので
これだと確認が出来ていないように思いますがどのように確認されたのでしょう?


> また、受け取り側をデバックしたいのですが、渡す側がexeをキックしているから無理でしょうか?
>
Loadの直後当たりにメッセージボックスでも表示しておいてメッセージボックスが表示された
タイミングでプロセスにアタッチすると良いと思います。
引用返信 編集キー/
■66854 / inTopicNo.6)  Re[4]: アプリから別のアプリケーションを実行する
□投稿者/ YM (5回)-(2013/05/31(Fri) 12:20:33)
>>受け取る方
>>    Console.WriteLine(cmd)
> WinFormアプリだと統合環境外での実行時はコンソール出力の表示がないので
> これだと確認が出来ていないように思いますがどのように確認されたのでしょう?

すみません。下記の方法で確認しました。
TextBox1.Text = cmd
引用返信 編集キー/
■66855 / inTopicNo.7)  Re[5]: アプリから別のアプリケーションを実行する
□投稿者/ 魔界の仮面弁士 (234回)-(2013/05/31(Fri) 12:26:31)
No66854 (YM さん) に返信
> すみません。下記の方法で確認しました。
> TextBox1.Text = cmd

Command や Environment.CommandLine ではなく、
Environment.GetCommandLineArgs を利用されたのですよね。

Environment.GetCommandLineArgs の戻り値は配列であったかと思いますが、
上記 cmd 変数では、配列内の何番目の情報を表示させているのでしょうか?
引用返信 編集キー/
■66858 / inTopicNo.8)  Re[6]: アプリから別のアプリケーションを実行する
□投稿者/ YM (6回)-(2013/05/31(Fri) 13:38:12)

すみません。
配列内の何番目とか指定していなかった為、受け取れてないと勘違いしていました。

   'コマンドラインを配列で取得する
   Dim cmds As String = System.Environment.GetCommandLineArgs(1) 

上記のコーディングでうまく取れました


Hongliangさん、魔界の仮面弁士さん、shuさん ありがとうございました。
解決済み
引用返信 編集キー/
■66859 / inTopicNo.9)  Re[7]: アプリから別のアプリケーションを実行する
□投稿者/ 774RR (88回)-(2013/05/31(Fri) 14:08:56)
引数が取れるか取れないかは以上で解決かもしれないけど
パスワードや ID にシャープが入っているとかスペースが入っているとか、
そういう場合にどうすべきかは今のうちに検討しておくほうがいいと思う。

単純文字列結合でそういう引数を生成しないほうが安全な場合多し。
解決済み
引用返信 編集キー/
■66860 / inTopicNo.10)  Re[5]: アプリから別のアプリケーションを実行する
□投稿者/ pang2 (24回)-(2013/05/31(Fri) 14:09:46)
適切なデバッグ方法を知っていれば自力で解決できたはずです。

> すみません。下記の方法で確認しました。
> TextBox1.Text = cmd

MessageBoxがよかったのでは?

> また、受け取り側をデバックしたいのですが、渡す側がexeをキックしているから無理でしょうか?

複数プロセスのデバッグ
http://msdn.microsoft.com/ja-jp/library/vstudio/a404w14b(v=vs.90).aspx
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -