- - PR -
DLL同士の通信
投稿者 | 投稿内容 | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-02-06 15:06
適当な定義をしたクラス、例えば
class Hoge { public: int integer; string str; } を、ArrayListに入れた場合は、どうなりますか? よく考えると「C++」で「構造体」は無いのだから、「__value」キーワードを使う意味があるのだろうか?という疑問がわいてきました。 全てのクラスは暗黙的に「System:bject」クラスを継承して作られるので、ArrayListが要求する「Objectクラスへのポインタ」にキャストすることができます。「struct」と「class」の違いは、「デフォルトのアクセス指定がpublicか、privateか」の違いでしかないのだから、「__value」キーワードが何らかの悪さをしているのではないでしょうか。 | ||||||||||||||||||||||||
|
投稿日時: 2004-02-06 16:48
ども、ほむらです。
------- 優希氏へ 偶然こんなページを見つけたのですが役に立たないでしょうか? http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vcmex/html/vclrf__box.asp #ごめんなさい、やっていること同じでした。 Jitta氏へ >よく考えると「C++」で「構造体」は無いのだから .NETで構造体の意味が変わってしまいましたね。。 .NETの構造体は便利そうで悪くはないのですけど。。。 別に構造体じゃなくてclassでいいジャンとか思ってしまったり(笑 昔の構造体だったらアドレス入れるだけですんだんですけどね〜 #修正がてら追記しようと思ったけど #あまりに適当すぎたので思いとどまる(^^;;;;;; #でもやっぱり気になるので追記
キャストでエラーが出るだけでデータの内容そのものは 意図したものになっているのでしょうか? もし可能ならばウォッチでアドレスを動かしてデータを確認してみては? [ メッセージ編集済み 編集者: ほむら 編集日時 2004-02-06 17:43 ] | ||||||||||||||||||||||||
|
投稿日時: 2004-02-06 17:56
優希です。
早速、試して見ました。 まずは、クラスを定義して・・・、
送信側のソースでArrayListに格納する、、、
それで・・・、 受信側のソースで受け取ると、
↑こんな感じで良いのですよねぇ!? でも、先程と同じく
となります。 こんども、"obj"には値(Hoge型)が入っておりました。 しかし、キャストした行で "pData"がNULLになって、 それを次の行で参照しようとしたところ、エラーになりました。
えぇ、このサイトも拝見しました(^^;)
データそのものは、合っておりましたよ〜。 | ||||||||||||||||||||||||
|
投稿日時: 2004-02-08 14:25
meiです。
DLL同士の通信ではないですが、 単純にコントロールの親子関係手繰って値を取るのは如何でしょうか? コードは抜粋なので分かり難いのでちょっと説明を。 Sub1はボタンを作成し、Sub2はテキストボックスを作成します。 以下のコードはSub1側でボタンイベントでSub2で作成したテキストボックの内容を表示します。
非同期通信(BeginInvoke)で作成したコントロールで試していますが上手く行っています。 上の例はごちゃごちゃやってしまっていますが、 コントロールを管理しているクラスの参照をそれぞれのDLL(というかクラスのインスタンス)に渡すようにして、 コントロール管理クラス経由で他のコントロールへアクセスするのが良いと思います。 [ メッセージ編集済み 編集者: mei 編集日時 2004-02-08 16:39 ] | ||||||||||||||||||||||||
|
投稿日時: 2004-02-09 09:11
このことから、まずは『「__value」や「ボックス化」による障害ではない』、と判断して良さそうですね。 次はArrayListのデータとして、「型定義されたヌルのデータ」が入っているのか、「ヌル値」が入っているのか、それとも「型情報が失われている」のか、それの見極めかな?でもどうやって? | ||||||||||||||||||||||||
|
投稿日時: 2004-02-09 10:07
meiさん、Jittaさん、
ありがとうございます。
ほぉー、こういうやり方もあるのですね。 値だけを渡さず、別画面のコントロールの親ごと、ごっそりと渡す。。。 この方法も試してみたいと思います。
そうですね、「__value」による影響はないですね。 うーん、見極め方が難しいですねぇ(^^;) | ||||||||||||||||||||||||
|
投稿日時: 2004-02-09 10:09
ども、ほむらです。
------- Jitta氏へ
とりあえず、手近なところからということで DLLがいけないのかソースコードの記述がいけないのかを確かめる上でも DLLじゃなくて1個のプログラムとしてマージしてみるとか。。。 box化したときに手に入るのはコピーみたいですし。。。 ひとつのプログラムにしたときに同じエラーならソースの違い うまくいった場合はDLL経由というのが悪さしているということでどうでしょう? #できれば前者であってほしいものですね^^;;;; | ||||||||||||||||||||||||
|
投稿日時: 2004-02-09 10:22
そですね。それと、気になるのが、私のサンプルではそうしたのですが、実行形1個にライブラリ2個ですよね。で、ライブラリ間で値を受け渡ししたいと。ここで優希さんのPGの全体が見えないのですが、今エラーがでているのは「渡されたライブラリ」ですよね。この「渡す」操作を、 ・ライブラリ間で直にやっているのか ・実行形が親として中継しているのか というところ。で、中継しているなら、中継現場ではどのようになっているのか。 そして、「直にやりたい」ということですが、「直にやる」為には親が子に、もう一人の「子」を教えてやらなければならないのですが、その「子を教える」ところがどうなっているのか。また、型の情報をそれぞれのライブラリは知っているのか。ま、知っていなければコンパイル時にエラーがでているでしょうけど(^^; ##### えっと、ちょっと気になっていたのでこの辺で書いておきます。 結構この問題に深入りしていますが、それは質問内容に興味があることと、なにより優希さんがこちらの言ったことを少しプラスして返してくれるからです。「やってみました。ダメでした」ではなく、「やってみました。ダメだったので、こうしてみました。それでもダメでした」と、自分で工夫しているからです。その「少しプラス」がある、自分で工夫してくれると、こちらも「全てを書く」必要がないので楽だし、教わることもあり、楽しいです。 「どうしてこの問題にはこんなにレスが付くのに、私の問題には誰も答えてくれないの?」と疑問に思われている方は、「少しプラス」をしてみてください。質問に答えているのは「仕事」ではなく、「仕事の合間の息抜き」ですから。息抜きは楽で、楽しい方がいいですから。 [ メッセージ編集済み 編集者: Jitta 編集日時 2004-02-09 10:36 ] |