質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

10214閲覧

デスクトップアプリケーションから、外部アプリケーション(mstsc.exe)を起動して終了まで待機する

satou

総合スコア19

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2017/05/07 03:59

編集2017/05/07 08:29

###前提・実現したいこと
フォーム上のボタンをクリックすると、『前処理、「リモートデスクトップ接続」の接続、接続終了後に、後処理』を実行する。前処理にて、既に他のPCから「リモートデスクトップ接続」がされていることが判断された場合は、接続回避をしたい。

デスクトップアプリケーション(test.exe)のフォームに「ボタンコントロール」を配置し、「ボタンコントロール」のクリックで、
(0)接続してもよいか確認する前処理を実行、
(1)外部アプリケーションとして、「リモートデスクトップ接続」(「mstsc.exe /f /V:SVname」)を実行、
(2)「リモートデスクトップ接続」のダイアログが表示される。
(3)ログインに必要な所定情報を入力し、リモートデスクトップで作業を行う。
(4)利用者が、「リモートデスクトップ接続」の接続を解く(接続終了)、
(5)所定のプログラム( MsgBox("ok")、後処理(他のPCに接続してもよい旨を知らせる))を実行
を行いたい。

なお、リモートデスクトップの取り合いを無くす方法として、
https://oshiete.goo.ne.jp/qa/1617523.html
がありますが、この方法は、利用者がバッチファイルを直接実行するもので、今回、こちらの諸事情で採用は難しい状況です。

本件は、フォーム上のボタンをクリックしたときに、外部アプリケーションとして、mstsc.exeを実行する、を前提で解決を模索しています。
###発生している問題・エラーメッセージ
WaitForExit()が機能しない。
つまり、(1)の直後(5)が実行される。
(1)の実行後、数秒後に、(2)が表示される。この状態で、(3)を実行し、(4)を行っても、(5)は実行済されない(すでに実行済)。
###該当のソースコード
https://dobon.net/vb/dotnet/process/openfile.html
を参考に以下のコードを作成

Private Sub btnConnect_Click(sender As Object, e As EventArgs) ’前処理---接続してよいか確認する----(0) Dim p As New Process p.StartInfo.FileName = "mstsc.exe" p.StartInfo.Arguments = "/f /V:file_server" p.Start() p.WaitForExit() '-------(1),(2) p.Close() MsgBox("ok") '後処理(ここでは、分かり易いようにMsgBoxとしています)------(5) End Sub

###試したこと
(1)command.com で実行
p.StartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec")
p.StartInfo.Arguments = " /C start /wait mstsc.exe /f /V:file_server"

(2)バッチファイル(cc.bat)を実行
Dim sw As New IO.StreamWriter("cc.bat", False, System.Text.Encoding.GetEncoding("shift_jis"))
Using sw
sw.Write(System.Environment.GetEnvironmentVariable("ComSpec") & " /C start /wait mstsc.exe /f /V:file_server")
sw.WriteLine()
sw.Close()
End Using
p.StartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec")
p.StartInfo.Arguments = " /C start /wait cc.bat"

いずれも、mstsc.exeの終了まで、待機しない。
###補足情報(言語/FW/ツール等のバージョンなど)
windows7(64ビットOS)、Microsoft Visual Basic 2015でデスクトップアプリ(test.exe とします)を作成しています。

「mstsc.exe /f /V:SVname」の起動が遅すぎて、mstsc.exeの起動中にもかかわらず、WaitForExitが起動を検知できずに、終了と判断しているような挙動をします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下の MSDN Forums のスレッドによると、 mstsc.exe は自身がシステムのプラットフォームとは異なるバイナリであると認識した場合 (つまり、 64-bit 環境で 32-bit の mstsc.exe を起動した場合) 、適切な mstsc.exe を改めて起動し、自身は即座に終了してしまう動作をするようです。

Launching MSTSC using Process on 64-bit Windows in WPF application

もしもこの状況に該当している場合、プロジェクトを x64 か AnyCPU 向けに構成してビルドすると、直接 64-bit の mstsc.exe を起動し Process.WaitForExit() が動作するようになると思うので、御確認頂くと良いかもしれません。

投稿2017/05/07 11:59

argparse

総合スコア1017

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

satou

2017/05/07 15:38

ご回答、ありがとうございます。プロジェクトのプロパティ、「コンパイル」を確認しましたところ、プラットフォーム、コンパイル オプション共に「AnyCPU」になっていましたが、その下の「32ビットを優先(P)」チェックボックスにチェックが入っていました。このチェックを外すと、Process.WaitForExit() が作動しました。このチェックボックスにチェックが入っていたため、開発環境のOSが64ビットにも関わらず、コンパイルは32となっていたようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問