- PR -

親画面(EXE)と子画面(DLL)の作成

投稿者投稿内容
優希
ベテラン
会議室デビュー日: 2003/08/12
投稿数: 92
投稿日時: 2003-08-15 08:41
meiさん、ありがとうございます。


> これですが、ひょっとして呼んでいるDLLがアンマネージドになってて、
> その所為じゃないでしょうか?(想像なので違ってたらすみません)
> 何か問題がありそうな部分が分かったら教えて下さい。

まだ調べてないのですが、
エラー内容を記述しておきます。

「追加情報 : parameter #3 を集成できません。このクラスの型の定義にレイアウト情報がありません。」

と、表示されてしまうのです。


また何か分かったら、書き込みをします。
宜しくお願い致します。
優希
ベテラン
会議室デビュー日: 2003/08/12
投稿数: 92
投稿日時: 2003-08-15 15:17
お世話になります。


先程、記述していただいたソースを元に、
試してみましたが、何の変化も起こりませんでした。
もちろん、スレッド形式ではなく、普通にやっております。
以下が大まかなコードです。


コード:
         ///// Main.exeでの呼び出し /////
   	     …中略…
	Assembly asmb = Assembly::LoadFrom(S"…\sub1.dll");  // アセンブリの読み込み
	ISub *sub = static_cast<ISub*>(asmb->CreateInstance("Sub"));  // インスタンスの生成
	sub->Build(pic);	←★ここまで来ても何もしないで進むと思われる。★


コード:
	///// ISub.h /////
	public __gc __interface ISub{
		void Build(PictureBox *pic);
	};


コード:
	///// Sub1.h /////
	public __gc class Sub1 : public ISub{
	public:
		Sub1();	// コンストラクタ
		void Build(PictureBox *pic);
	};
	void Sub1::Build(PictureBox *pic){
		pic->BackColor = Color::FromArgb(255, 0, 255); // 色を変える
	}



それと、3つ気になっている点があります。
@DLLを作成するときの「〜.def」には、記述は要らないのでしょうか?
Aエントリポイントは必要なのでしょうか?
 (必要な場合、【 #include <windows.h>】の文が必要になりますよね!?)
Bそれぞれのフォルダに生成されるファイル類(以下参照)を
 どのフォルダにどのように処理すればよいのでしょうか!?
 (例)
・[Mainフォルダ]に、[ISubフォルダ]および[Sub1フォルダ]のhファイルを格納する。
・[Mainフォルダ]に、[ISubフォルダ]および[Sub1フォルダ]のlibファイルを格納し、リンクさせる。
・[Mainフォルダ]に、[ISubフォルダ]および[Sub1フォルダ]のdllファイルを格納する。

など。


// 生成されるファイル類
Mainフォルダ (親画面)
・Main.exe

ISubフォルダ (インタフェース)
・ISub.dll
・ISub.h
・ISub.lib

Sub1フォルダ (子画面)
・Sub1.dll
・Sub1.h
・Sub1.lib


以上、分かる範囲で構いませんので、
宜しくお願い致します。
mei
大ベテラン
会議室デビュー日: 2003/04/08
投稿数: 114
投稿日時: 2003-08-15 20:51
こんばんは、meiです。

↑こちらにManaged C++版のサンプルを作ってみました。
参考にしてみて下さい。
>削除しました。

引用:

優希さんの書き込み (2003-08-15 15:17) より:
@DLLを作成するときの「〜.def」には、記述は要らないのでしょうか?
Aエントリポイントは必要なのでしょうか?
 (必要な場合、【 #include <windows.h>】の文が必要になりますよね!?)
Bそれぞれのフォルダに生成されるファイル類(以下参照)を
 どのフォルダにどのように処理すればよいのでしょうか!?



まず1、2番目ですが、
Managed C++で作ったDLLは見た目は普通のDLLですが、中身は全然別のものです。
今までのWin32アプリのエントリーポイントのような考え方はしません。
また、ISub.dllにあるクラスを使いたい場合、
普通のC++での考え方では、ヘッダをインクルードして・・・だったのですが、
Managed C++では、プロジェクトの参照にDLLを追加して使用します。
#ManagedはDLLの中にヘッダに相当するものを持っているのでヘッダが不要なのです。

Managed C++はC#と比べて、ヘッダを使うケースとDLL参照を使うケースがあるので、
ややこしいですね。
#実は昨日、これに嵌ってC#のサンプルを書く羽目になったのでした。
#よーやく、どういう原理で動いているのか分かりました(汗)。

3番目については、サンプルを参考にして下さい。
あと、優希さんがサンプルをダウンロードしたら削除しますので、
ダウンロードし終わったら教えて下さい。


[ メッセージ編集済み 編集者: mei 編集日時 2003-08-15 20:52 ]

[ メッセージ編集済み 編集者: mei 編集日時 2003-08-15 22:15 ]
優希
ベテラン
会議室デビュー日: 2003/08/12
投稿数: 92
投稿日時: 2003-08-15 21:54
お世話になります。
優希です。

サンプルプログラムをありがとうございました。
早速ダウンロードをしたので、
削除して構いません m(_ _)m


ダウンロードしたものを立ち上げようとしたら、
どうもバージョンが合わないらしく、
立ち上げることが出来ませんでした。
でも、ソースは見れるので参考にしたいと思います。


> @DLLを作成するときの「〜.def」には、記述は要らないのでしょうか?
> Aエントリポイントは必要なのでしょうか?

これらは特に要らないってことですね。
納得いたしました。


> Bそれぞれのフォルダに生成されるファイル類(以下参照)を
>  どのフォルダにどのように処理すればよいのでしょうか!?

↑なんですが、
プロジェクトを立ち上げることができなかったため、
内部の設定(インクルード等)は見ることができなかったのですが、
特にしているのでしょうか!?
「tmp」フォルダがあったので、
おそらく「Main」と「Sub1」と「Sub2」で設定しているのかと。。。
どの項目で設定しているか、教えて頂けませんか?


> Managed C++では、プロジェクトの参照にDLLを追加して使用します。

この"追加"というのは、前述の「tmp」フォルダの参照ということですか?
それとも、「#using "xxx.dll"」などが要るってことなのでしょうか?



meiさんの説明と、ちらっと見た限りでは、
ヘッダファイルやライブラリは、特に移動させる
ことはしなくて良いのですね!?

それと、ソースを見てみたのですが、
namespace名称をすべて統一して、
「Form1.cpp」だけ、namespaceで宣言しておくのですね。
なるほど。。。

あと、「AssemblyInfo.cpp」ってどのファイルにもありますが、
これがないとうまく動かないのでしょうか?
自分は空プロジェクトから作っていたので。。。


質問だらけで、すいません。
またご教授のほど、宜しくお願い致します。
mei
大ベテラン
会議室デビュー日: 2003/04/08
投稿数: 114
投稿日時: 2003-08-15 22:12
引用:

優希さんの書き込み (2003-08-15 21:54) より:
ダウンロードしたものを立ち上げようとしたら、
どうもバージョンが合わないらしく、
立ち上げることが出来ませんでした。


あらら、私のところはVS.NET2003しかないので、
残念ながらVS.NET2002のソリューションは用意出来なさそうです。

引用:

「tmp」フォルダがあったので、
おそらく「Main」と「Sub1」と「Sub2」で設定しているのかと。。。
どの項目で設定しているか、教えて頂けませんか?


このtmpフォルダは関係無いです。
私も作った覚えは無いのですが、何故か出来ていて・・・


引用:

> Managed C++では、プロジェクトの参照にDLLを追加して使用します。

この"追加"というのは、前述の「tmp」フォルダの参照ということですか?
それとも、「#using "xxx.dll"」などが要るってことなのでしょうか?


大まかな手順を説明します。

1,空のソリューションを作成します。

2,ソリューションにISubプロジェクト(.NET DLL)を追加し、インタフェースを作成します。

3,ソリューションにSub1プロジェクト(.NET DLL)を追加し、ISubプロジェクトを参照に追加します。追加の仕方は、ソリューションエクスプローラーでSub1プロジェクトの参照設定を選択し、右クリックします。参照の追加メニューを選ぶと、参照の追加ダイアログが選択されますよね?
ここで、プロジェクトタブを開き、ISubプロジェクトを選んで選択ボタンを押して、ダイアログを閉じます。
これがDLLを参照に追加といってた作業のことでした。分かり難くてすみません。

で、SubクラスをISubから継承させて作成。

4,Sub2プロジェクトも同様です。

5,最後に、ソリューションにMainプロジェクトをウィンドウズフォームアプリケーション(.NET)で追加し、上記同様、ISubプロジェクトを参照に追加します。

あとは、サンプルプログラムを真似てコーディングしてみて下さい。


[ メッセージ編集済み 編集者: mei 編集日時 2003-08-15 22:13 ]
優希
ベテラン
会議室デビュー日: 2003/08/12
投稿数: 92
投稿日時: 2003-08-16 12:34
こんにちわ。

ソリューションの作り方の説明、
ありがとうございます。

ところがVS.NET2003と違うらしく
[参照設定]なるものが見当たりませんでした。
[プロジェクトの依存関係]っていうのがあったのですが、
これっていうのは、ひとつのソリューション内に
DLL用やEXE用のプロジェクトを作成しないと出来ない作業ですね。

たとえば、子画面用DLLだけを渡されて
それを参照する、ってことも可能なのでしょうか?

またまた
宜しくお願い致します。

mei
大ベテラン
会議室デビュー日: 2003/04/08
投稿数: 114
投稿日時: 2003-08-16 13:14
引用:

優希さんの書き込み (2003-08-16 12:34) より:
ところがVS.NET2003と違うらしく
[参照設定]なるものが見当たりませんでした。



VS.NET2002と2003はそんなに違ってたのですか・・・
あんまり気にしてませんでした。

では、別の手ということで。

まず、ソリューションに
・ISub
・Sub1
・Sub2
・Main
以上、4つのプロジェクトがあることを前提に話を進めます。

まず、ISub.DLLを作成します。
次に、ソリューションエクスプローラでSub1を選んだ状態で、
メニューから、プロジェクト(P)>参照の追加(R)で、
「参照の追加ダイアログ」が表示されます。
#VS.NET2002はソリューションエクスプローラの右クリックでコレを出せないのですか?

ダイアログ上ではプロジェクトタブは存在しますか?
存在すれば、前回説明した方法を行って下さい。
無ければ、.NETタブを開いて参照ボタンを押して、
MySolutionディレクトリ直下にあるDebugディレクトリにISub.DLLがあると思いますので、それを選択して下さい。(ISub.DLLが見つからなければ他のディレクトリのでもいいです)

この作業をSub2,Mainプロジェクトに対しても行って下さい。
これで出来なければ、文章でこれ以上説明するのは無理そうです。
優希
ベテラン
会議室デビュー日: 2003/08/12
投稿数: 92
投稿日時: 2003-08-16 13:58
お世話様です。

引用:

次に、ソリューションエクスプローラでSub1を選んだ状態で、
メニューから、プロジェクト(P)>参照の追加(R)で、
「参照の追加ダイアログ」が表示されます。
#VS.NET2002はソリューションエクスプローラの右クリックでコレを出せないのですか?



ソリューションエクスプローラの右クリックでも、
該当する見当たりません。
各々プロジェクトを右クリックすると、「Web 参照の追加」とありますが、
これも違うようです。

先程も書いたのですが、
[プロジェクトの依存関係]を選択すると、
プロジェクト毎に「依存先」を決めることができます。
これが近いのかなぁ〜と思います。
あとは、試してみないとなんとも言えませんが。


引用:

ダイアログ上ではプロジェクトタブは存在しますか?
存在すれば、前回説明した方法を行って下さい。
無ければ、.NETタブを開いて参照ボタンを押して、
MySolutionディレクトリ直下にあるDebugディレクトリにISub.DLLがあると思いますので、それを選択して下さい。(ISub.DLLが見つからなければ他のディレクトリのでもいいです)



「プロジェクトタブ」も「.NETタブ」も見つからないんです。
存在するのは、
「ソリューションエクスプローラ」タブ、「クラスビュー」タブ、
「リソースビュー」タブだけですねぇ。

すいません、
いろいろ助言してもらって。

とりあえず、[プロジェクトの依存関係]を試してみようと思います。

あと、もうひとつ。
この方法だと、プロジェクトに対して"参照"を行なうってことなんですよね。
だとすると、子画面を作ってもらった人から、
プロジェクトごと貰わないといけないってことなのでしょうか!?
単純にDLLだけを貰うのではなくって。

以上、宜しくお願い致します。


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