DOBON.NET DOBON.NETプログラミング掲示板過去ログ

exe同士の値のやり取り

環境/言語:[Win 2000 Pro]
分類:[.NET]

おはようございます
今回質問したい内容は表記の通りexe同士のやり取りについて
教えて欲しいのですが

*実現したい事
 あるexeを実行し、出てきたformのボタンをクリックすると
 別exeが立ち上がり(検索画面)そこで検索した内容をもと
 のformに反映させたい。

*調べた結果
 VB6.0などではActiveXなどを用いて実現しているようで
 あるがVB.netではどうなるかは今一つ不明?

いろいろとインターネットで
"vb.net exe 引数" "vb.net exe やりとり"
などの内容で検索したのですが今ひとついいものがみつかりま
せん。 よければリンクなどもよろしくお願いします。

何卒よろしくお願いします。
こんにちは、じゃんぬねっと です。

■No9559に返信(こうさんの記事)

色々な手法があるのですが、

> あるexeを実行し、出てきたformのボタンをクリックすると
> 別exeが立ち上がり(検索画面)そこで検索した内容をもとのformに反映させたい。

検索結果なる膨大なものを返すのでしたら、
クラス ライブラリにした方が良いのではないでしょうか?
質問です。
・EXEを分ける必要はあるのですか?
・元、検索の両プログラムはあなたのもの(今から作成を含む)ですか?

#基本的には.Netリモーティングです。
>  VB6.0などではActiveXなどを用いて実現しているようで
単純な通信では、私は DDE を使ってました。(^^;
VB.NETではサポートされていませんけれども……。

>  あるがVB.netではどうなるかは今一つ不明?
このあたりかな?

[異なるアプリケーション ドメインのオブジェクトどうしの .NET リモート処理によるアクセス]
http://www.microsoft.com/japan/msdn/library/ja/cpguide/html/cpconaccessingobjectsinotherapplicationdomainsusingnetremoting.asp
みなさんいつも回答ありがとうございます。
大変に参考になります。

>質問です。
>・EXEを分ける必要はあるのですか?
>・元、検索の両プログラムはあなたのもの(今から作成を含む)ですか?

他のプログラムからもこのexeを使用することがあるので
別々にしようとおもうのですが・・・

何卒よろしくお願いします。
> >・EXEを分ける必要はあるのですか?
> >・元、検索の両プログラムはあなたのもの(今から作成を含む)ですか?
> 他のプログラムからもこのexeを使用することがあるので
> 別々にしようとおもうのですが・・・
> 何卒よろしくお願いします。

まぁその程度なんですよね。
であればEXEを分割するなんてことは止めておきなさいと言っておきます。(^^
こんにちは、じゃんぬねっと です。

■No9563に返信(こうさんの記事)
> 他のプログラムからもこのexeを使用することがあるので
> 別々にしようとおもうのですが・・・
>
> 何卒よろしくお願いします。

わ、私のレスは無視ですか。(^-^;)
クラス ライブラリを使いましょう。
すいません 別に無視したつもりじゃな
いです。 申し訳ないです。

じゃんぬねっとさんにはいつもお世話になって
いるので感謝してます。

それでこんなこと聞くのもなんなんですが
クラス ライブラリとはどんなものなんでしょうか?
.net初心者にてご容赦ください。

何卒よろしくお願いします。


> わ、私のレスは無視ですか。(^-^;)
> クラス ライブラリを使いましょう。
■No9569に返信(こうさんの記事)
> すいません 別に無視したつもりじゃないです。
> 申し訳ないです。

いやいや、冗談ですよ (^^)

> クラス ライブラリとはどんなものなんでしょうか?
> .net初心者にてご容赦ください。

コード ライブラリの作成
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/Vbcon/html/vbtskCreatingCodeLibrary.asp
じゃんぬねっとさんありがとうございます
今頑張ってMSDNの方を読んでいます。
ちなみに検索画面から取得してくるデータは
一件だけでたいしたものでない場合簡単にと
ってくる方法はありますか?

何卒よろしくお願いします。
こんにちは、じゃんぬねっと です。

■No9576に返信(こうさんの記事)
> ちなみに検索画面から取得してくるデータは
> 一件だけでたいしたものでない場合簡単にとってくる方法はありますか?

色々方法があると思います。

簡単な方法として、

 http://jeanne.wankuma.com/tips/form/06-closingbutton.html

のように、

    Dim hSearchForm As New SearchForm()

    '/ 検索フォームで [承諾] ボタンが押下された場合のみデータを持ってくる。
    If hSearchForm.ShowDialog() = DialogResult.OK Then
        TextCode.Text = hSearchForm.ResultCode
        TextName.Text = hSearchForm.ResultName
    End If

沢山結果を返したければ、構造体や配列を利用すれば良いのですから、
ShowDialog() の変わりに、結果を返す Function を書いても良いでしょう。

    Dim hSearchForm As New SearchForm()
    Dim tReturns    As StructSearchResult

    tReturns = hSearchForm.ShowSearchDialog()

    '/ 値が返された場合のみ
    If tReturns Is Nothing = False Then
        TextCode.Text = tReturn.Code
        TextName.Text = tReturn.Name
    End If

紹介はしませんが、他にも色んな方法があります。(^-^;)
じゃんぬねっとさんサンプルありがとうございます。
それとホームページの方見させていただきましたとても
見やすくてよかったです。(^^)

そこで前から教えてもらっている コードライブラリ
について自分なりにヘルプを呼んでみたのですが、
これはこんな感じのことなのでしょうか?

検索画面をexeファイルするのではなくそれを.dllファイル
にして、それをもとの画面で使用し、値のやり取りをすると
いった感じでしょうか?
なんだかわかりにくい記述で申し訳ありません。

何卒よろしくお願いします。
こんにちは、じゃんぬねっと です。

■No9581に返信(こうさんの記事)
> じゃんぬねっとさんサンプルありがとうございます。
> それとホームページの方見させていただきましたとても
> 見やすくてよかったです。(^^)

ありがとうございます。m(_ _)m

> 検索画面をexeファイルするのではなくそれを.dllファイルにして、
> それをもとの画面で使用し、値のやり取りをするといった感じでしょうか?
> なんだかわかりにくい記述で申し訳ありません。

まあ、動きとしてはまさしくその通りです。
それと、インプロセスになるというのも強みですね。
じゃんぬねっとさん度々回答ありがとうございます。
じゃんぬねっとさんから教えてもらった記事を読んで

>ライブラリに新しいコードを作成する場合は、次の手順に従ってください。
>[プロジェクト] メニューの [新しい項目の追加] をクリックし、新しい項目 (コント>ロール、コンポーネント、クラスなど) を追加します。
>コードを記述します。
>[プロジェクト] メニューの [既存項目の追加] をクリックして、コード ライブラリに>既存の項目を追加します。
>適切な .vb ファイルまたは .cs ファイルを検索し、ダブルクリックして追加します。
>ソリューションのビルドを行います。ビルドしたソリューションは、コンパイル後  に .dll ファイルになります。

を実行したのですが.dllファイルを作成できません。
何か原因があるのでしょうか??
.dllファイルとは一つのソリューションファイルに対して
作成されるのでしょうか?
お気づきの点があればよろしくお願いします。
こんにちは、じゃんぬねっと です。

■No9584に返信(こうさんの記事)
> .dllファイルを作成できません。
> 何か原因があるのでしょうか??

「プロジェクトのプロパティ」の出力タイプが「クラス ライブラリ」になっており、
正常にビルドが通れば、出力パス (通常は \Bin\) の中に作成されると思うのですが...
ちょっと、状況が今ひとつわからないですが...

> .dllファイルとは一つのソリューションファイルに対して作成されるのでしょうか?

いいえ、プロジェクト単位ですよ。
現在のソリューションはどういう構成になっているのでしょうか?
またまた返答ありがとうございます。

> 「プロジェクトのプロパティ」の出力タイプが「クラス ライブラリ」になっており、
> 正常にビルドが通れば、出力パス (通常は \Bin\) の中に作成されると思うのですが...
> ちょっと、状況が今ひとつわからないですが...

プロジェクトのプロパティというのはツールボックスの「プロジェクト」の
一番したのプロパティの中のことでしょうか?
ちなみにそこの項目のなかには「クラス ライブラリ」をみつけることがで
きませんでした。 すいません・・・

>>.dllファイルとは一つのソリューションファイルに対して作成されるのでしょうか?
>
> いいえ、プロジェクト単位ですよ。
> 現在のソリューションはどういう構成になっているのでしょうか?

ソリューションとプロジェクトの単位が今ひとつわかってないので
変な質問になってしまい申し訳ありません。
ソリューションエクスプローラーの一番上(ツリー)の一番上の部分
プロジェクトは2番目の〜のプロジェクトというとこにあたるのでしょう
か?

毎度毎度親切に教えていただきありがとうございmす。
とりあえずね、Visual Studioの操作とかも載っているような本買いませんか?
こんにちは、じゃんぬねっと です。(^-^A)

■No9587に返信(こうさんの記事)
> プロジェクトのプロパティというのはツールボックスの「プロジェクト」の
> 一番したのプロパティの中のことでしょうか?
> ちなみにそこの項目のなかには「クラス ライブラリ」をみつけることがで
> きませんでした。 すいません・・・

んにゃ?
そもそも「ツール ボックス」には「プロジェクト」なる項目はないと思いますが...
通常は右に表示されている、ソリューション エクスプローラから、
該当のプロジェクトを選択し、右クリックメニューの [プロパティ(R)] を選択します。
すると、「xxxx のプロパティ ページ」なるダイアログが出現するハズです。

ここの、[共通プロパティ] ペインの中の [全般] の中に (というより、最初から選択されている)
「出力の種類 (O)」なる項目があると思うのですが...

> ソリューションエクスプローラーの一番上(ツリー)の一番上の部分
> プロジェクトは2番目の〜のプロジェクトというとこにあたるのでしょうか?

ソリューション エクスプローラ から見て、ルートがソリューションです。
それにぶら下がっているのが、プロジェクトです。(通常の構成では)
さらに、そこにぶら下がってるのが、そのプロジェクトに参加しているファイル群ですね。

> 毎度毎度親切に教えていただきありがとうございmす。

画面の説明は難しいです。

# この掲示板に、添付ファイルとしてアップしても良いのですが、
# 過去ログに入ると消えちゃうので使わないようにしてます。
じゃんぬねっとさんありがとうございます。
無事.dllファイルを作成することが出来ました。
本当にありがとうございます。

それでその.dllを参照設定に追加し.dllの中の
フォームなどを参照することができました。

>Dim hSearchForm As New SearchForm()
> '/ 検索フォームで [承諾] ボタンが押下された場合のみデータを持ってくる。
> If hSearchForm.ShowDialog() = DialogResult.OK Then
> TextCode.Text = hSearchForm.ResultCode
> TextName.Text = hSearchForm.ResultName
> End If

そこで前に教えて頂いた上記のコードなのですが

>TextCode.Text TextName.Text などは元フォームのコントロール名
だと思うのですが
>hSearchForm.ResultCode hSearchForm.ResultName
などは.dllファイルのフォームの何にあたるのでしょうか?
すみませんが教えて下さい。

何卒よろしくお願いします。
こんにちは、じゃんぬねっと です。

■No9597に返信(こうさんの記事)
> じゃんぬねっとさんありがとうございます。
> 無事.dllファイルを作成することが出来ました。
> 本当にありがとうございます。

何が原因だったのでしょうか?
あの手順で、問題ありませんでしたか?
その辺りも合わせて報告くださると、今度このスレッドを見る人のためになります。

> そこで前に教えて頂いた上記のコードなのですが

> > hSearchForm.ResultCode
> > hSearchForm.ResultName

> などは.dllファイルのフォームの何にあたるのでしょうか?

クラス ライブラリの中に SearchForm という型の検索フォームがあると仮定しています。
クラス・型名は、貴方が実際に使う DLL の中身と同一にしてください。

ResultCode, ResultName というのは、その検索フォームのプロパティです。
検索フォームで [承諾] ボタンが押下された場合に、ResultCode と ResultName に値を入れておき、
それを、元のフォーム側から、プロパティを通して取得する、ということです。
これらも、名前は自由に決めてください。
じゃんぬねっとさんいつもいつもありがとうございます。
返事が遅れてすいません急な仕事が入ったもので

> 何が原因だったのでしょうか?
> あの手順で、問題ありませんでしたか?
> その辺りも合わせて報告くださると、今度このスレッドを見る人のためになります。

じゃんぬねっとさんに教えていただいた手順でやったら
うまくいきました。出力の種類で変えるのがわからなか
ったことが原因です。

そこでまたまた質問なのですが

メインのフォームから.dllのフォームを呼びだすことは
問題なく行えたのですが、(SearchForm.show)
しかし SearchForm.TextBox1 などとしても
エラーになります。 textbox1というプロパティ
がでてこないようです。
何か.dll作成に原因があるのでしょうか?

よろしくお願いします。
こんにちは、じゃんぬねっと です。

■No9627に返信(こうさんの記事)
> じゃんぬねっとさんに教えていただいた手順でやったらうまくいきました。
> 出力の種類で変えるのがわからなかったことが原因です。

報告ありがとうございました。m(_ _)m

> しかし SearchForm.TextBox1 などとしてもエラーになります。
> textbox1というプロパティがでてこないようです。
> 何か.dll作成に原因があるのでしょうか?

SearchForm クラスでどのような実装がなされて、
どのようなメンバがあるのかが私には判りませんので、想像ですが。

通常、SearchForm にある TextBox1 の Text を取得したい場合は、
以下のように「プロパティ」として公開し、外部からの参照を可能にします。
別に、メソッドでも構いませんが、イメージとしてはプロパティの方が掴みやすいでしょう。

Public Class SearchForm
    Inherits System.Windows.Forms.Form
'  _______________________
' | Windows フォーム デザイナで生成されたコード |
'  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

#Region " TextBox1.Text へアクセスするための読み取り専用プロパティ "

    Public ReadOnly Property TextBox1_Text() As String
        Get
            Return Me.TextBox1.Text
        End Get
    End Property

#End Region

End Class
じゃんぬねっとさんお返事ありがとうございます。
> こんにちは、じゃんぬねっと です。

> SearchForm クラスでどのような実装がなされて、
> どのようなメンバがあるのかが私には判りませんので、想像ですが。
>
> 通常、SearchForm にある TextBox1 の Text を取得したい場合は、
> 以下のように「プロパティ」として公開し、外部からの参照を可能にします。
> 別に、メソッドでも構いませんが、イメージとしてはプロパティの方が掴みやすいでしょう。
>
> Public Class SearchForm
> Inherits System.Windows.Forms.Form
> ' _______________________
> ' | Windows フォーム デザイナで生成されたコード |
> '  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
>
> #Region " TextBox1.Text へアクセスするための読み取り専用プロパティ "
>
> Public ReadOnly Property TextBox1_Text() As String
> Get
> Return Me.TextBox1.Text
> End Get
> End Property
>
> #End Region
>
> End Class

上記のように記述を追加し.dllファイルを作成しましたところ、
テキストボックスの値をとってくることができました。
本当にありがとうございます。 感謝感謝です。(_ _)
実際に行いたい処理はSearchFormにあるスプレッドシートに検索
した結果を表示させ、その中の一行をダブルクリックしたらその
行の内容をメインのフォームに反映したいというものですが、
同じような手順で考えてみます。
またわからないことがあればよろしくお願いします。
じゃんぬねっとさんおおはようございます。

> 実際に行いたい処理はSearchFormにあるスプレッドシートに検索
> した結果を表示させ、その中の一行をダブルクリックしたらその
> 行の内容をメインのフォームに反映したいというものですが、
> 同じような手順で考えてみます。
> またわからないことがあればよろしくお願いします。

上記の手順で作成しようとしたのですが、一点わからないことが
あるのでよければ教えて下さい。

今SearchFormに新しくSpreadSheetの方を追加しました(名前:spd)

Public ReadOnly Property spd_Text() As String
Get
Return Me.spd.Sheets(0).GetText(i, 0)
End Get
End Property

Private Sub spd_CellDoubleClick(ByVal sender As Object, ByVal e As    FarPoint.Win.Spread.CellClickEventArgs) Handles spd.CellDoubleClick
i = spd.Sheets(0).ActiveRowIndex
End Sub

上記のような記述をSearchFormに追加し
mainFormには下記の記述を追加しました。
If subform.ShowDialog() = DialogResult.OK Then
TextBox1.Text = subform.spd_Text
End If

このように記述するとボタンをクリックした際にはスプレッドの
ダブルクリックされた行の値をとってくる事ができるのですが
スプレッドをダブルクリックした時点で値を取ってきたいのです
がどのようにすればよいのか探したのですがなかなかみつかり
ません。 

何卒よろしくお願いします。
おはようございます、じゃんぬねっと@徹夜明け です。(つД`)',・

■No9634に返信(こうさんの記事)
> このように記述するとボタンをクリックした際にはスプレッドの
> ダブルクリックされた行の値をとってくる事ができるのですが
> スプレッドをダブルクリックした時点で値を取ってきたいのです
> がどのようにすればよいのか探したのですがなかなかみつかりません。 

Spread の DoubleClick イベントに以下の実装を加えます。
Me.DialogResult = DialogResult.OK
じゃんぬねっとさんお返事ありがとうございます。

> おはようございます、じゃんぬねっと@徹夜明け です。(つД`)',・

徹夜って大丈夫ですか? あまり無理はしないで下さいね。


>>このように記述するとボタンをクリックした際にはスプレッドの
>>ダブルクリックされた行の値をとってくる事ができるのですが
>>スプレッドをダブルクリックした時点で値を取ってきたいのです
>>がどのようにすればよいのか探したのですがなかなかみつかりません。 
>
> Spread の DoubleClick イベントに以下の実装を加えます。
> Me.DialogResult = DialogResult.OK

上記実装を追加したところうまくいきました。
ありがとうございます。 これでほぼやりたいこと
の実現につながりました。本当にありがとうございます。

最後にもう一つ教えていただきたいのですが
>Me.DialogResult = DialogResult.OK  や
フォームロード時の
Button1.DialogResult = DialogResult.OK
の意味合い やなぜSearchForm側で上記コードが
実行された場合フォーム画面(SearchForm)がなくなる
のかが今ひとつわかりません。 勉強不足で申し訳
ないのですがよければ教えて下さい。(_ _)
おはようございます、じゃんぬねっと です。

■No9637に返信(こうさんの記事)
> 最後にもう一つ教えていただきたいのですが
> Me.DialogResult = DialogResult.OK や
> フォームロード時の Button1.DialogResult = DialogResult.OK
> の意味合いやなぜ SearchForm 側で上記コードが
> 実行された場合フォーム画面 (SearchForm) がなくなるのかが今ひとつわかりません。

"なくなる" とは、閉じられるということで宜しいでしょうか?

DialogResult プロパティに次のようなくだりがあります。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformsbuttonclassdialogresulttopic.asp

> -----------------------------------------------------------------------
 このプロパティの値が DialogResult.None 以外の値に設定されていて、
 親フォームが ShowDialog メソッドで表示されている場合は、
 ボタンをクリックして親フォームを閉じます。
 ユーザーがイベントをフックする必要はありません。
 ボタンがクリックされると、フォームの DialogResult プロパティがボタンのDialogResult に設定されます。
> -----------------------------------------------------------------------

DialogResult の意味合いはこちらを参照してください。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfSystemWindowsFormsDialogResultClassTopic.asp
じゃんぬねっとさんお返事ありがとうございました。
ヘルプの方をみたところなんとなくてはありますが
納得できました。 一応これで解決しました。
じゃんぬねっとさんにはなんとお礼をいったら
いいものか・・・

これからもよろしくお願いします。
本当にありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板