- 題名: exe⇔dll間の構造体の受け渡し
- 日時: 2006/07/07 18:31:20
- ID: 16545
- この記事の返信元:
- (なし)
- この記事への返信:
- [16546] Re[1]: exe⇔dll間の構造体の受け渡し2006/07/07 18:46:18
- ツリーを表示
はいこーんさんがとても丁寧にコード付きでお書きになられてるので もういいかとも思いますが… Integerの値だろうが自分で作ったクラスや構造体の値(インスタンス)だろうが、 同様に受け渡しできますよ。
じゃんぬねっと さん返信ありがとうございます。
#管理人さん、みんさん、解決済みなのに続けててすみません。
> しかし、そこ以上に重視したいのは、構造体のメンバが単純であるかどうかです。
> また、複数件の結果を返すようであれば、間違いなくクラスというかコレクションを返した方が良いです。
>
> はい、参照渡しは直感的ではないのと、コード変更時に危険をはらみますから、
> 戻り値として '敢えて' 「別の入れ物」 で返した方が良いです。
>
> しかし、引数に渡す情報と戻ってくる情報が同じ型であるというのは違和感があります。
> これは勝手な想像なんですが、渡したい情報と取得したい情報が一緒になっていませんか..?
下記のような構造体をdll側に宣言しています。
検索フォームから返すのは1件だけです。
入力フォーム側からKey1〜3を設定し、検索フォームでそれを条件にして
検索した結果をcolumnA〜Dに入れて入力フォームに返します。
(key3は検索フォーム側で入力し直すこともできるためI/Oになっています)
これは、まさしくじゃんぬねっと さんが懸念されているよう”一緒”という
ケースになるのでしょうか?
Public Structure 構造体A
Public key1 As String '[I] キー1
Public key2 As String '[I] キー2
Public key3 As String '[I/O]キー3
Public columnA As String '[O] 取得項目A
Public columnB As integer '[O] 取得項目B
Public columnC As integer '[O] 取得項目C
Public columnD As String '[O] 取得項目D
End Structure
■No16565に返信(トップ姫さんの記事)
> #管理人さん、みんさん、解決済みなのに続けててすみません。
受け渡しに関することですから、お許しくださるかと...
気になるようでしたら、別スレッドへ移動します。
> 下記のような構造体をdll側に宣言しています。
> 検索フォームから返すのは1件だけです。
> 入力フォーム側からKey1〜3を設定し、検索フォームでそれを条件にして
> 検索した結果をcolumnA〜Dに入れて入力フォームに返します。
> (key3は検索フォーム側で入力し直すこともできるためI/Oになっています)
> これは、まさしくじゃんぬねっと さんが懸念されているよう”一緒”という
> ケースになるのでしょうか?
はい、そういったケースになります。
受け取る側の都合と受け渡す側の都合だけで考えてみてください。
このメソッドを組んだ方以外は、何をどうすれば良いのか直感ではわかりません。
以下のように受け渡し用と受け取り用と分けるべきだと思います。
Public Class 受け渡し用
Public Key1 As String '[I] キー1
Public Key2 As String '[I] キー2
Public Key3 As String '[I] キー3
End Class
Public Class 受け取り用
Public Key3 As String '[O] キー3
Public ColumnA As String '[O] 取得項目A
Public ColumnB As Integer '[O] 取得項目B
Public ColumnC As Integer '[O] 取得項目C
Public ColumnD As String '[O] 取得項目D
End Class
単純なデータクラスですが、動的なチェックが必要な場合はプロパティを使った方が良いです。
受け取ったものは、勝手に改変されないように ReadOnly 修飾子をつけた方が良いでしょうね。
このあたりは、サンプルなので割愛しています。
■No16568に返信(まどかさんの記事)
> それが大きな理由でした。
フォローを書いておいて良かったです。
> 個人的に公開クラス+Friendフォームなんていう構造が主だったりするので
> Me.ShowDialogって書いたことが無かったりします。。。
あれ? 公開クラス + 隠蔽化されたインナークラスじゃないんですねw
この場合は、
> > それ以外の正当な方法は、外で ShowDialog メソッドを呼び出し戻り値を確認。
> > DialogResult.OK だったら、専用の Result プロパティから、結果を取得のような流れでしょうか。
こんなイメージなのがありがちでしょうね。
ShowDialog メソッドについては場所よりか、タイミングの方が重要だと思います。
> よく考えれば昔からLoadでMe.Showなんてことをしてるわけで、問題ないですね。
> 単にぱっと見自分で自分の結果待ちっていうのに反応してしまっただけでした。
そういう意味では Load イベントのタイミングで Show メソッドを呼び出す方が違和感があります。
Load ステートメントだけで Show メソッドを呼び出してしまうのは実装者からすれば予想外の出来事です。
Call Load(frmHoge)
究極的には Show~ なんて名前のメソッドであれば、実装者は予想できることになります。
分類:[.NET]
最近このサイトを知り、参考・利用させてもらっています。
VB.NET4日目の初心者です。
実現したいことなんですが、
入力フォーム(exe)で入力されたキー情報を構造体に設定し、
その構造体のキー情報を検索フォーム(dll)上に設定します。
検索後、検索結果の中から選択された1行のデータを同じ構造体に設定し、
入力フォーム側に返します。
つまり、1つの構造体でキー情報(in)、検索結果(out)を管理させ、
それをexe⇔dll間で使うということです。
構造体の定義の仕方は調べてやっとわかってきたのですが、
その構造体の受け渡し方がわからず手が止まってしましました。
どなたかアドバイス、参考サイトなど教えていただければ幸いです。
どうぞよろしくお願いします。