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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.66823 の関連記事表示

<< 0 >>
■66823  アプリから別のアプリケーションを実行する
□投稿者/ YM -(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でしょうか?


    よろしくお願いします
親記事 /過去ログ113より / 関連記事表示
削除チェック/

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

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

    Environment.GetCommandLineArgsメソッドなどが使えると思います。
    いつ取得するかは好きにして良いです。
記事No.66823 のレス /過去ログ113より / 関連記事表示
削除チェック/

■66826  Re[1]: アプリから別のアプリケーションを実行する
□投稿者/ 魔界の仮面弁士 -(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
記事No.66823 のレス /過去ログ113より / 関連記事表示
削除チェック/

■66851  Re[2]: アプリから別のアプリケーションを実行する
□投稿者/ YM -(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をキックしているから無理でしょうか?


    よろしくお願いします



記事No.66823 のレス /過去ログ113より / 関連記事表示
削除チェック/

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

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


    > また、受け取り側をデバックしたいのですが、渡す側がexeをキックしているから無理でしょうか?
    >
    Loadの直後当たりにメッセージボックスでも表示しておいてメッセージボックスが表示された
    タイミングでプロセスにアタッチすると良いと思います。
記事No.66823 のレス /過去ログ113より / 関連記事表示
削除チェック/

■66854  Re[4]: アプリから別のアプリケーションを実行する
□投稿者/ YM -(2013/05/31(Fri) 12:20:33)
    >>受け取る方
    >>    Console.WriteLine(cmd)
    > WinFormアプリだと統合環境外での実行時はコンソール出力の表示がないので
    > これだと確認が出来ていないように思いますがどのように確認されたのでしょう?

    すみません。下記の方法で確認しました。
    TextBox1.Text = cmd
記事No.66823 のレス /過去ログ113より / 関連記事表示
削除チェック/

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

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

    Environment.GetCommandLineArgs の戻り値は配列であったかと思いますが、
    上記 cmd 変数では、配列内の何番目の情報を表示させているのでしょうか?
記事No.66823 のレス /過去ログ113より / 関連記事表示
削除チェック/

■66858  Re[6]: アプリから別のアプリケーションを実行する
□投稿者/ YM -(2013/05/31(Fri) 13:38:12)

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

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

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


    Hongliangさん、魔界の仮面弁士さん、shuさん ありがとうございました。
記事No.66823 のレス / END /過去ログ113より / 関連記事表示
削除チェック/

■66860  Re[5]: アプリから別のアプリケーションを実行する
□投稿者/ pang2 -(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
記事No.66823 のレス / END /過去ログ113より / 関連記事表示
削除チェック/

■66859  Re[7]: アプリから別のアプリケーションを実行する
□投稿者/ 774RR -(2013/05/31(Fri) 14:08:56)
    引数が取れるか取れないかは以上で解決かもしれないけど
    パスワードや ID にシャープが入っているとかスペースが入っているとか、
    そういう場合にどうすべきかは今のうちに検討しておくほうがいいと思う。

    単純文字列結合でそういう引数を生成しないほうが安全な場合多し。
記事No.66823 のレス / END /過去ログ113より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -