- PR -

DLL同士の通信

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-06 15:06
 適当な定義をしたクラス、例えば
class Hoge {
public:
int integer;
string str;
}
を、ArrayListに入れた場合は、どうなりますか?

 よく考えると「C++」で「構造体」は無いのだから、「__value」キーワードを使う意味があるのだろうか?という疑問がわいてきました。
 全てのクラスは暗黙的に「System:bject」クラスを継承して作られるので、ArrayListが要求する「Objectクラスへのポインタ」にキャストすることができます。「struct」と「class」の違いは、「デフォルトのアクセス指定がpublicか、privateか」の違いでしかないのだから、「__value」キーワードが何らかの悪さをしているのではないでしょうか。
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 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でいいジャンとか思ってしまったり(笑

昔の構造体だったらアドレス入れるだけですんだんですけどね〜

#修正がてら追記しようと思ったけど
#あまりに適当すぎたので思いとどまる(^^;;;;;;

#でもやっぱり気になるので追記
引用:

分けてやってみてもエラーになり、
エラーになるのは2行目です。


キャストでエラーが出るだけでデータの内容そのものは
意図したものになっているのでしょうか?
もし可能ならばウォッチでアドレスを動かしてデータを確認してみては?

[ メッセージ編集済み 編集者: ほむら 編集日時 2004-02-06 17:43 ]
優希
ベテラン
会議室デビュー日: 2003/08/12
投稿数: 92
投稿日時: 2004-02-06 17:56
優希です。

早速、試して見ました。

まずは、クラスを定義して・・・、
コード:
/// <summary>
/// クラス
/// <summary>
public __gc class Hoge
{
	public: 
	int integer; 
	String *str; 
};



送信側のソースでArrayListに格納する、、、
コード:
///
/// 送信側ソース
///
 :
Hoge *hg = new Hoge();
hg->integer = 206;
hg->str = S"テスト文字列";
lstSendData->Add(hg);

 :
 :

if(wrapInst != 0)
{
	wrapInst->ReceiveData(lstSendData);		// データ送信
}




それで・・・、
受信側のソースで受け取ると、
コード:
///
/// 受信側ソース
///
void ReceiveData(ArrayList *DataTbl)
{
	Object *obj = DataTbl->get_Item(0);
	Hoge *pData = dynamic_cast<Hoge*>(obj);
	TextBox2->Text = pData->str;
}



↑こんな感じで良いのですよねぇ!?

でも、先程と同じく
引用:

オブジェクト参照がオブジェクトインスタンスに設定されていません。


となります。

こんども、"obj"には値(Hoge型)が入っておりました。
しかし、キャストした行で "pData"がNULLになって、
それを次の行で参照しようとしたところ、エラーになりました。




引用:

ほむらさんの書き込み (2004-02-06 16:48) より:

#ごめんなさい、やっていること同じでした。


えぇ、このサイトも拝見しました(^^;)

引用:

ほむらさんの書き込み (2004-02-06 16:48) より:

キャストでエラーが出るだけでデータの内容そのものは
意図したものになっているのでしょうか?
もし可能ならばウォッチでアドレスを動かしてデータを確認してみては?


データそのものは、合っておりましたよ〜。

mei
大ベテラン
会議室デビュー日: 2003/04/08
投稿数: 114
投稿日時: 2004-02-08 14:25
meiです。

引用:

優希さんの書き込み (2004-02-02 21:16) より:

ところが、変数strTextContentはNULLになってしまい、
うまく取得することが出来ませんでした。

これは非同期呼び出しで行なっているからなのでしょうか?
変数strTextContentがNULLにならずに、
内容がきちんと取れる方法があれば、アドバイスをお願い致します。



DLL同士の通信ではないですが、
単純にコントロールの親子関係手繰って値を取るのは如何でしょうか?

コードは抜粋なので分かり難いのでちょっと説明を。
Sub1はボタンを作成し、Sub2はテキストボックスを作成します。
以下のコードはSub1側でボタンイベントでSub2で作成したテキストボックの内容を表示します。
コード:

void Build(PictureBox* pb) {
Button* b = new Button();
b->add_Click(new EventHandler(this, OnClick));
b->Location = Point(0, 0);
b->Text = S"ボタン";
try {
pb->Controls->Add(b);
}
catch (System::ArgumentException* ex) {
MessageBox::Show(ex->Message);
}
}

void OnClick(Object* sender, EventArgs* e) {
// senderは自分自身
Button* b = dynamic_cast<Button*>(sender);
// buttonの親はPictureBox、その親はForm
Control* form = b->Parent->Parent;
// Formの子はSub1用とSub2用のPictureBox、Sub2用のPictureBoxの子がTextBox
String* msg = form->Controls->get_Item(1)->Controls->get_Item(0)->Text;
// TextBoxの内容を表示
MessageBox::Show(msg);
}


非同期通信(BeginInvoke)で作成したコントロールで試していますが上手く行っています。

上の例はごちゃごちゃやってしまっていますが、
コントロールを管理しているクラスの参照をそれぞれのDLL(というかクラスのインスタンス)に渡すようにして、
コントロール管理クラス経由で他のコントロールへアクセスするのが良いと思います。


[ メッセージ編集済み 編集者: mei 編集日時 2004-02-08 16:39 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-09 09:11
引用:

優希さんの書き込み (2004-02-06 17:56) より:

早速、試して見ました。

でも、先程と同じく

こんども、"obj"には値(Hoge型)が入っておりました。
しかし、キャストした行で "pData"がNULLになって、
それを次の行で参照しようとしたところ、エラーになりました。


 このことから、まずは『「__value」や「ボックス化」による障害ではない』、と判断して良さそうですね。
 次はArrayListのデータとして、「型定義されたヌルのデータ」が入っているのか、「ヌル値」が入っているのか、それとも「型情報が失われている」のか、それの見極めかな?でもどうやって?
優希
ベテラン
会議室デビュー日: 2003/08/12
投稿数: 92
投稿日時: 2004-02-09 10:07
meiさん、Jittaさん、
ありがとうございます。

引用:

meiさんの書き込み (2004-02-08 14:25) より:

非同期通信(BeginInvoke)で作成したコントロールで試していますが上手く行っています。

上の例はごちゃごちゃやってしまっていますが、
コントロールを管理しているクラスの参照をそれぞれのDLL(というかクラスのインスタンス)に渡すようにして、
コントロール管理クラス経由で他のコントロールへアクセスするのが良いと思います。



ほぉー、こういうやり方もあるのですね。
値だけを渡さず、別画面のコントロールの親ごと、ごっそりと渡す。。。

この方法も試してみたいと思います。




引用:

Jittaさんの書き込み (2004-02-09 09:11) より:

このことから、まずは『「__value」や「ボックス化」による障害ではない』、と判断して良さそうですね。
次はArrayListのデータとして、「型定義されたヌルのデータ」が入っているのか、「ヌル値」が入っているのか、
それとも「型情報が失われている」のか、それの見極めかな?でもどうやって?



そうですね、「__value」による影響はないですね。
うーん、見極め方が難しいですねぇ(^^;)

ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2004-02-09 10:09
ども、ほむらです。
-------
Jitta氏へ
引用:

このことから、まずは『「__value」や「ボックス化」による障害ではない』、と判断して良さそうですね。
 次はArrayListのデータとして、「型定義されたヌルのデータ」が入っているのか、「ヌル値」が入っているのか、それとも「型情報が失われている」のか、それの見極めかな?でもどうやって?


とりあえず、手近なところからということで
DLLがいけないのかソースコードの記述がいけないのかを確かめる上でも
DLLじゃなくて1個のプログラムとしてマージしてみるとか。。。
box化したときに手に入るのはコピーみたいですし。。。

ひとつのプログラムにしたときに同じエラーならソースの違い
うまくいった場合はDLL経由というのが悪さしているということでどうでしょう?
#できれば前者であってほしいものですね^^;;;;
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-09 10:22
引用:

ほむらさんの書き込み (2004-02-09 10:09) より:

とりあえず、手近なところからということで
DLLがいけないのかソースコードの記述がいけないのかを確かめる上でも
DLLじゃなくて1個のプログラムとしてマージしてみるとか。。。
box化したときに手に入るのはコピーみたいですし。。。

ひとつのプログラムにしたときに同じエラーならソースの違い
うまくいった場合はDLL経由というのが悪さしているということでどうでしょう?
#できれば前者であってほしいものですね^^;;;;


 そですね。それと、気になるのが、私のサンプルではそうしたのですが、実行形1個にライブラリ2個ですよね。で、ライブラリ間で値を受け渡ししたいと。ここで優希さんのPGの全体が見えないのですが、今エラーがでているのは「渡されたライブラリ」ですよね。この「渡す」操作を、
・ライブラリ間で直にやっているのか
・実行形が親として中継しているのか
というところ。で、中継しているなら、中継現場ではどのようになっているのか。
 そして、「直にやりたい」ということですが、「直にやる」為には親が子に、もう一人の「子」を教えてやらなければならないのですが、その「子を教える」ところがどうなっているのか。また、型の情報をそれぞれのライブラリは知っているのか。ま、知っていなければコンパイル時にエラーがでているでしょうけど(^^;


#####
えっと、ちょっと気になっていたのでこの辺で書いておきます。

 結構この問題に深入りしていますが、それは質問内容に興味があることと、なにより優希さんがこちらの言ったことを少しプラスして返してくれるからです。「やってみました。ダメでした」ではなく、「やってみました。ダメだったので、こうしてみました。それでもダメでした」と、自分で工夫しているからです。その「少しプラス」がある、自分で工夫してくれると、こちらも「全てを書く」必要がないので楽だし、教わることもあり、楽しいです。

 「どうしてこの問題にはこんなにレスが付くのに、私の問題には誰も答えてくれないの?」と疑問に思われている方は、「少しプラス」をしてみてください。質問に答えているのは「仕事」ではなく、「仕事の合間の息抜き」ですから。息抜きは楽で、楽しい方がいいですから。

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-02-09 10:36 ]

スキルアップ/キャリアアップ(JOB@IT)