お世話になります。
環境 Windows2000 SP4 / Visual C++ 6.0 SP6 / MFC MDI
他のプロジェクトで使用していたリソースを含むクラスを新しく作成したプロジェクトか
ら再利用することは可能でしょうか?
既存のプロジェクトAxx(通常のMFC MDIベース)
CMainFrame
CChildFrame
CAxxApp
CAxxDoc
CAxxView
CAA (基本クラスCWndから作成したクラス)
CDlgA (ClassWizardでダイアログリソースから作成したCDialogクラス)
CAAはDlgA.hをincludeして関数xxx()内でDoModal()で使用。
CAxxViewやCAxxDocからはCAA::xxx()を問題なく使用。
新規のプロジェクトBxx(通常のMFC MDIベース)
CMainFrame
CChildFrame
CBxxApp
CBxxDoc
CBxxView
CBxxViewやCBxxDocからプロジェクトAxxのCAAを使用したい。
#include ...\AA.h
#include ...\DlgA.h
CAA* pAA;
pAA = new CAA();
pAA->xxx();
delete pAA;
プロジェクトの設定 - オブジェクト/../モジュールに
...\AA.obj
...\DlgA.obj
を追加。
リソースIDがダブらないようにCDlgA関連を修正。
プロジェクトBxxのresource.hにCDlgA関連を追加。
上記のようなやり方では上手く行きませんでした。
根本的に間違ってるのでしょうか?
参考になるURLやアドバイスがありましたらよろしくご教授お願い致します。
AxxのクラスビューアからCAAを選択して右クリック
ギャラリへ追加
Bxxのプロジェクトでメニューの「プロジェクト」
「プロジェクトへ追加」「コンポーネントおよびコントロール」
を選択して「コンポーネントおよびコントロールギャラリ」の
一覧からAxxのフォルダ内のCAA.ogxを選択するのはどうでしょう。
#やりたいことと違うかもしれないのでBxxの代わりに新規で
#プロジェクト作って試してみてくださいね。
再利用って言ってもいろんな再利用の仕方があるわけだけど
・ソースコードレベルでの再利用
・オブジェクトファイルレベルでの再利用
・静的ライブラリ (LIB) として再利用
・動的ライブラリ (DLL) として再利用
・プラグインとか OLE とかそういう抽象レベルが上での再利用
俺ならソースコードレベルで再利用するか DLL で再利用するかな。
オブジェクトファイルの再利用はコンパイルオプションの違いなどの影響が出やすく
俺としてはあまり推奨しない(不可能ではないがやりたいとは思わないレベル)
まあ好きな方法でやってくれ。
とり さん tetrapod さんご回答ありがとうございます。
>とり さん
早速試してみようと思いましたが、拡張子 .ogx のファイルが見つかりませんでした。
.ogx 後で調べてみます。
>tetrapod さん
「・ソースコードレベルでの再利用」とは、リソースを含めたソース(ファイル)を丸ごと
コピーしてくるようなイメージのことでしょうか?
以前は別プロジェクトを作成するたびに必要な部分を再度書いていたのですが、面倒で
「・オブジェクトファイルレベルでの再利用」(これに当てはまるのかな?)的な使い方を
してます。ダイアログ等のリソースを含まないものは、特に問題も無かったので便利に
使っておりました。
「コンパイルオプションの違いなど」は気を付けていませんでしたので、確認してみます。
ちなみに、
「・プラグインとか OLE とかそういう抽象レベルが上での再利用」は自分には敷居が高
すぎて。
「・静的ライブラリ (LIB) として再利用」と「・動的ライブラリ (DLL) として再利用」
は、データの受け渡しは同じような感じになるのでしょうか?
MFC AppWizard (dll) で作成した DLL は使用しているのですが、マップドファイルを介
してデータのやり取りしているので使い勝手が悪い印象がありまして。そもそも、そんな
使い方が間違い?
>早速試してみようと思いましたが、拡張子 .ogx のファイルが見つかりませんでした。
>AxxのクラスビューアからCAAを選択して右クリック
>ギャラリへ追加
この部分を実行していないのかも。(文章が分かりにくくてすみません)
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200107/01070014.txt
過去ログでBunさんがわかりやすく解説してくれていました。
すみません。「ギャラリへ追加」してませんでした。
過去ログ参考になります。
ありがとうございました。
ども、PATIOです。
> 「・静的ライブラリ (LIB) として再利用」と「・動的ライブラリ (DLL) として再利用」
> は、データの受け渡しは同じような感じになるのでしょうか?
> MFC AppWizard (dll) で作成した DLL は使用しているのですが、マップドファイルを介
> してデータのやり取りしているので使い勝手が悪い印象がありまして。そもそも、そんな
> 使い方が間違い?
データの引き渡し方法に関してはDLLもしくはLIB内のクラスの設計次第のはずです。
LIBは勿論ですが、DLLも呼び出し側と同じプロセスで同じメモリ空間を使って
いるはずですからメモリ上の置けないほど大きなデータで無いなら、同じプロジェクト内の
クラスや関数と同じようにデーターの受け渡しは出来るはずです。
ただ、メモリマップドファイルだと結局はメモリ上に載せてますし、
あまり変わらないような気もしますね。
使い方が間違いとかというよりも設計の問題ではないかと思います。
メモリマップドファイルで無いと駄目と言うのはプロセスが違う時くらいしか
思いつかないですけれど。
ギャラリ使ってみました。こんな簡単にコピーが出来るんですね。
ちょっと心配していたコピー元の変更に対する対応も問題ありませんでした。
リソースIDに気をつけていればちょっとした再利用(一時的に使っていらなくなったら削
除)にはちょうどいいです。
PATIOさん レスありがとうございます。
おっしゃる通りと思います。先の自分のレスを書きながら「何でだろう」と思いつつ。
VC++をやり始めた頃に本を読みながら作ったものですが、かなり思い違いをしていたとこ
ろがあります。動くようにするのが精一杯って感じでした。
今回はギャラリを使ったコピーで対応したいと思います。
頻繁に使うものは、再度、Lib化(実は何度か試みて挫折)にもチャレンジしたいと思います。
みなさん、ありがとうございました。