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

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

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

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

VB.NET

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

Q&A

解決済

2回答

1633閲覧

入力された値をshell関数で起動した別のexeに値を渡したい。

ryuuzu

総合スコア30

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

VB.NET

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

0グッド

0クリップ

投稿2020/03/02 01:55

VBである程度のコードは組めますが、ファイルの指定やサーバー間の通信などの知識はよくわかっていない者です。

###内容

現在、visual studioでVBを使ったアプリを作成しています。
そのアプリ(アプリ1)の中でshell関数を使って別のexe(アプリ2)を呼び出し、exeの中で取得したデータを元のアプリの中に返す。という作業をやりたいと考えております。
簡単にですがアプリの内容としては

アプリ1
会員番号とパスワードを入力すると、メインメニューに移行する。
アプリ2
会員番号を入力すると、その会員番号の持つポイントをデータベースから取得する。

というものです。

###やりたいこと
イメージとしては
アプリ1で会員番号とパスワードを入力する。一致していたらアプリ2を起動すると同時にアプリ2へ会員番号の値を渡す。

アプリ2で会員番号の持つポイントを取得し、アプリ1に返す。

アプリ2から帰ってきたポイントを、アプリ1で表示する。

というものです。
アプリ1から2へ会員番号を渡すにはどのようにコードを入力したらよろしいでしょうか?
また、アプリ2からアプリ1へポイントの値を返すにはどうすればよいでしょうか?こちらはアプリ2のコードに記述するものなのでしょうか?

よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

※コードの提示をしたらほぼ丸投げ請負回答になってしまうので、アイディアの提示に留めます。

簡単に考えられるのは、アプリ2の実行時に「会員番号」と「ポイントを保存するファイル名のPATH」をコマンドラインオプションに指定し、アプリ2ではそれをパラメータとして動作する、と言うような方法です。
外部アプリケーションを起動する、ファイルを関連付けられたソフトで開く - dobon.net

当然、アプリ1では「会員番号」と「ポイントを保存するファイル名のPATH」を指定してアプリ2を呼び出すようにコードを追加する必要がありますし、アプリ2ではコマンドラインオプション文字列からそれらパラメータを取り出す処理が必要になるでしょう。ポイントを取得する際にエラーが発生するようであればエラー内容を記述したファイルを保存しなければならないかもしれないし、プロセス実行の際の終了コードを返す、なども考えられます。

その他、アプリ1とアプリ2の間でデータをやり取りするようなものでは名前付きパイプを含むプロセス間通信を使う方法や、TCP/IPなどのネットワーク通信をする方法が考えられますが、どれを採用するかは要件次第です。

尚、質問者さんは先の別の質問でリモートシェルの利用を検討されているようですので、本質問がそれと関連するのであれば、呼び出し形式にあった修正を検討することも必要になるかと思います。
shell関数で別のサーバーのexeを起動したい。 - teratail#243979

投稿2020/03/02 02:54

dodox86

総合スコア9183

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

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

ryuuzu

2020/03/03 02:20

dodox86さん、前回に引き続き回答ありがとうございます。 大変お恥ずかしながらコマンドラインの辺りの知識が無いのですが会員番号やポイントを保存するファイル名のPATHというのはメモ帳をファイル内に作成し、そこに番号や会員番号を保存した後にもう片方のアプリがそれらのパラメータを参照しそれぞれの処理を行うようにするといった感じなのでしょうか?
dodox86

2020/03/03 03:14

> そこに番号や会員番号を保存した後にもう片方のアプリがそれらのパラメータを参照しそれぞれの処理を行うようにするといった感じなのでしょうか? 別にそれでもできるでしょうし、大体は合っていますが、私の提示した方法は少し違います。 「メモ帳をファイル内に作成し、」少し用語に使い方に混乱があるようですが、「メモ帳」と言うのはWindowsのnotepad.exeと言う実行ファイルであり、入力した内容をテキストファイルに保存するアプリケーションです。 アプリ2にとって処理を行うにあたって必須な情報は「会員番号」なはずです。ですのでそれがパラメータ(オプション、引数)の第1候補です。アプリ2が処理した後、処理が成功したかどうかなど様々な情報が多分あるでしょうから、それらをアプリ1に返して教える必要があるなら、ファイルがいいかもしれない、と言うことで2つ目のパラメータにそのファイルのPATHを指定する(第2候補)、と言うことが私の回答です。 Windowsのコマンドプロンプト上で色々と作業をされたことは無いでしょうか。例えば2つのファイル内容を比較する fcコマンド(C:\Windows\System32\fc.exe) を実行するときに、比較したいファイル2つを指定して C> fc C:\file1.txt C:\file2.txt などとしますが、この"fc C:\file1.txt C:\file2.txt"全体がコマンドラインであり、"C:\file1.txt C:\file2.txt"部分がfcコマンドに対するオプション文字列です。fc コマンド、この質問の場合は「アプリ2」に相当しますが、アプリ2を実行したときにこれらの引数が渡り、アプリ2のプログラム自身で取り出すこととなります。この引数にどのような値をセットし、どう扱うかは質問者さん自身の設計によります。コマンドプロンプト上で様々なコマンドを操作しているとき、そのコマンド(大抵、それらもひとつのアプリケーションです)に対してどのようなオプションを渡しているのか、渡されたアプリケーションがそれらによってどう動きを変えるのかをイメージすると少し理解が早まるかもしれません。 dobon.net 起動時のコマンドライン引数を取得する https://dobon.net/vb/dotnet/programing/commandline.html 別回答でいただいていますが、あちらはdirコマンド(アプリ2に相当)が通常、画面に出力するdir一覧結果を、呼び出したアプリ1で文字列として取り出す例です。そのような方法ももちろん可能でしょう。この場合はアプリ2にとってのパラメータは「会員番号」だけですむかもしれません。様々なやり方があるということです。
ryuuzu

2020/03/05 06:04

詳細な回答ありがとうございました。上司と相談したのですが社の方針でリモートシェル等のセキュリティ関係は禁止されてしまい、別のものが同じネットワーク系で新たにデータベースを作成してそこから取得することになりました・・・。前回の質問から引き続きご回答いただいたにもかかわらずこのような結果になってしまい申し訳ございません。ありがとうございました。
dodox86

2020/03/05 06:12

> このような結果になってしまい申し訳ございません。 いえ、お気遣いにはおよびません。当初やろうとしていたことが、質問回答によって詳細や問題が明らかになり、それを検討材料として別の解法を採用することになったということで、質問回答を「検討フェーズ」と捉えれば当然のことです。気にされる必要は無いです。
guest

0

リモートシェルを使って指定したサーバーで dir を実行して結果をもらうサンプルです。

VB

1Sub Main() 2 Using p As New Process() 3 With p.StartInfo 4 .FileName = "winrs" 5 .Arguments = "-r:(サーバー名) dir c:\windows\system32" 6 .RedirectStandardOutput = True 7 .UseShellExecute = False 8 End With 9 p.Start() 10 Dim tsk As Task(Of String) = p.StandardOutput.ReadToEndAsync() 11 p.WaitForExit() 12 tsk.Wait() 13 Console.WriteLine(tsk.Result) 14 End Using 15 Console.ReadKey() 16End Sub

結果が大きくなるとハングするので読み込みは非同期実行したほうがいいようです。

投稿2020/03/02 03:39

編集2020/03/03 00:43
KOZ6.0

総合スコア2626

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

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

ryuuzu

2020/03/05 06:04

ありがとうございました。リモートシェルでのデータ取得はセキュリティの関係で結局認められず、同じネットワーク系で新たにテーブル作成をしてデータ取得をする方針になりました・・・申し訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問