型を引数で渡す事はできますか?
<したい事>
現在、スプラッシュ用のダイアログのLIBを作成しています。
LIB内で外部より宣言したクラス(CMainFrame)を使用して、
フレーム生成がしたいです。
-------------------------------------------------------
| LIB |
-------------------------------------------------------
↓ ↓
EXE(A) EXE(B) ・・・・・
EXE(A)では、EXE(A)で宣言したCMainFrame、
EXE(B)では、EXE(B)で宣言したCMainFrameを使用したいです。
環境
VC++(2008)
Win7
テンプレートを勉強すればよろしいかと。
template<typename T> int foo(T /*value*/)
{
return sizeof(T);
}
int main()
{
std::cout << foo<short>(0) << std::endl;
std::cout << foo<int>(1) << std::endl;
std::cout << foo<long>(2) << std::endl;
std::cout << foo<long long>(3) << std::endl;
}
こういうことではなくて?
質問の意味がいまいち理解できません(vv;)。
仮にCMainFrameなるものが、MFCのCMDIFrameWndクラス等から
派生していた場合で、かつドキュメントビューアーキテクチャを使用し、
かつ真にメインウインドウを意味する場合、これを表示するには
LoadFrame()一発ですからLibに追い出すのはばかばかしいですよねぇ。
ドキュメントビューアーキテクチャを使用しない場合や、
メインウインドウでない場合等は単に派生先でCreate()をオーバーライド
するだけなので、これもLibに追い出す意味はありません。
さて、一般にスプラッシュウインドウとは、メインのウインドウが
表示される前か、または、表示はされたが、時間のかかる初期化が
また完了していない場合の暇つぶしに出すものです。
MFCの場合、前者のケースではアプリケーションクラスのInitInstance()内の
かなり先頭付近で当然CMainFrame::LoadFrame()の前になります。これが
一般的な出し方で、この場合スプラッシュウインドウとメインフレームとは
何の関係もありません。
次に後者の場合はCMainFrameがWM_CREATEを受け取った直後のWM_SIZE~WM_PAINT
の一連の初期化の直後、又はInitialUpdateから当該の初期化完了までとなり
ますので、一般にはそのスプラッシュウインドウはCMainFrameの所有物となる
ように設計されるはずですよねぇ。
いかなるデザインをするとスプラッシュウインドウ表示用Libの関数に
フレームインスタンスを渡す必要が生じるのでしょうか(質問)。
作りたいリブ:
<スプラッシュダイアログのLIB>
仕様:
ダミーのモーダルダイアログ(スプラッシュダイアログ)を起動させ、
モーダルダイアログ内部で、ウィンドウを作成する。
→正式に勉強した事がないので、用語の使い方が間違っていたらすみません。
スプラッシュダイアログのLIB内で、以下の処理を行いたいです。
clMainFrame = (CMainFrame*)RUNTIME_CLASS(CMainFrame)->CreateObject();
maruさんに、テンプレートの件を参考にしていますが、
どうもうまくいきません(;;)
何を悩んでいるのかわからんのだが、RUNTIME_CLASSマクロの結果であるCRuntimeClass
構造体へのポインタを渡せば済む話ではないのかな。
あと、仲澤さんがいう通り、そのライブラリにフレームを渡さなければならない必然性
も不明ですね。
メインウィンドウの前にスプラッシュウィンドウが立ち上がるタイプなら
たとえば
1:アプリケーション起動
2:デスクトップを親としたモードレスダイアログを出す(スプラッシュウィンドウ)
3:初期化のための処理をする。(途中経過をスプラッシュに)
4:初期化処理が終わったら、ダイアログを閉じる
5:初期化処理を踏まえたメインフレームを生成する
こんな流れなら、libとCMainFrameは無関係でいられる
(libが担当するのは2、4。もしくは3の途中経過表示のための受け口)
もしかして、
MFCのDLLが普通にやってることを言ってる?
MFCアプリにおいて、MFCを動的リンクにした場合、
CMainFrameクラスの定義はDLL中にいますが、
個々のEXEにおいて、独自のCMainFrameオブジェクトを宣言して
使ってますよね。
そーいうこと?
で、あるなら話は簡単。
MFCの拡張DLLを調べればOK。
メインフレームの生成をスプラッシュの方で行わなくてはならない
必然性が見えないので、そもそも渡す必要が無いのではないかと言う話に
なっていると思うのですが、質問されているご自身はその部分を理解して
作業を行なっていますか?
メインフレームはDoc-Viewアーキテクチャを使う場合、
そのアプリケーションのメインウインドウになる物なので
スプラッシュウインドウを出すライブラリ側で生成するのは
かなり違和感を覚えます。
ごく一部しか担当していないライブラリがアプリ全体を握っている部分まで
管理しているようなイメージになりますから。
一般的な考え方からすると生成したレベルで破棄も行なうと思うので
それならメインウインドウを破棄するのにスプラッシュウインドウを
出すライブラリの関数を呼び出して行うのかと言う話です。
ビジュアルだけならCMainFrameを生成する前に
モーダルダイアログを生成,そしてタイマで
一定時間経過後にモーダルダイアログ終了させてから通常処理
初期化とかそういうのさせない
っていうのはどうでしょう
親子も崩れないしね
スプラッシュダイアログのLIBで、フレーム生成をしないようにしました。
ちょっと忙しくて、返事が遅くなってしまい、申し訳ありません。
みなさん、ありがとうございました(><)/