型を引数で渡す – プログラミング – Home

通知
すべてクリア

[解決済] 型を引数で渡す


ねこ
 ねこ
(@ねこ)
ゲスト
結合: 22年前
投稿: 94
Topic starter  

型を引数で渡す事はできますか?

<したい事>
現在、スプラッシュ用のダイアログのLIBを作成しています。
LIB内で外部より宣言したクラス(CMainFrame)を使用して、
フレーム生成がしたいです。

-------------------------------------------------------
|  LIB |
-------------------------------------------------------
   ↓ ↓
  EXE(A)     EXE(B) ・・・・・

EXE(A)では、EXE(A)で宣言したCMainFrame、
EXE(B)では、EXE(B)で宣言したCMainFrameを使用したいです。

環境
 VC++(2008)
 Win7


引用未解決
トピックタグ
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

テンプレートを勉強すればよろしいかと。

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;
}

こういうことではなくて?


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

質問の意味がいまいち理解できません(vv;)。

仮にCMainFrameなるものが、MFCのCMDIFrameWndクラス等から
派生していた場合で、かつドキュメントビューアーキテクチャを使用し、
かつ真にメインウインドウを意味する場合、これを表示するには
LoadFrame()一発ですからLibに追い出すのはばかばかしいですよねぇ。

ドキュメントビューアーキテクチャを使用しない場合や、
メインウインドウでない場合等は単に派生先でCreate()をオーバーライド
するだけなので、これもLibに追い出す意味はありません。

さて、一般にスプラッシュウインドウとは、メインのウインドウが
表示される前か、または、表示はされたが、時間のかかる初期化が
また完了していない場合の暇つぶしに出すものです。
MFCの場合、前者のケースではアプリケーションクラスのInitInstance()内の
かなり先頭付近で当然CMainFrame::LoadFrame()の前になります。これが
一般的な出し方で、この場合スプラッシュウインドウとメインフレームとは
何の関係もありません。

次に後者の場合はCMainFrameがWM_CREATEを受け取った直後のWM_SIZE~WM_PAINT
の一連の初期化の直後、又はInitialUpdateから当該の初期化完了までとなり
ますので、一般にはそのスプラッシュウインドウはCMainFrameの所有物となる
ように設計されるはずですよねぇ。

いかなるデザインをするとスプラッシュウインドウ表示用Libの関数に
フレームインスタンスを渡す必要が生じるのでしょうか(質問)。


返信引用
ねこ
 ねこ
(@ねこ)
ゲスト
結合: 22年前
投稿: 94
Topic starter  

作りたいリブ:
<スプラッシュダイアログのLIB>
仕様:
ダミーのモーダルダイアログ(スプラッシュダイアログ)を起動させ、
モーダルダイアログ内部で、ウィンドウを作成する。
→正式に勉強した事がないので、用語の使い方が間違っていたらすみません。

スプラッシュダイアログのLIB内で、以下の処理を行いたいです。

clMainFrame = (CMainFrame*)RUNTIME_CLASS(CMainFrame)->CreateObject();

maruさんに、テンプレートの件を参考にしていますが、
どうもうまくいきません(;;)


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

何を悩んでいるのかわからんのだが、RUNTIME_CLASSマクロの結果であるCRuntimeClass
構造体へのポインタを渡せば済む話ではないのかな。

あと、仲澤さんがいう通り、そのライブラリにフレームを渡さなければならない必然性
も不明ですね。


返信引用
ryo
 ryo
(@ryo)
ゲスト
結合: 23年前
投稿: 252
 

メインウィンドウの前にスプラッシュウィンドウが立ち上がるタイプなら
たとえば

1:アプリケーション起動

2:デスクトップを親としたモードレスダイアログを出す(スプラッシュウィンドウ)

3:初期化のための処理をする。(途中経過をスプラッシュに)

4:初期化処理が終わったら、ダイアログを閉じる

5:初期化処理を踏まえたメインフレームを生成する

こんな流れなら、libとCMainFrameは無関係でいられる
(libが担当するのは2、4。もしくは3の途中経過表示のための受け口)


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

もしかして、
MFCのDLLが普通にやってることを言ってる?

MFCアプリにおいて、MFCを動的リンクにした場合、
CMainFrameクラスの定義はDLL中にいますが、
個々のEXEにおいて、独自のCMainFrameオブジェクトを宣言して
使ってますよね。

そーいうこと?

で、あるなら話は簡単。
MFCの拡張DLLを調べればOK。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

メインフレームの生成をスプラッシュの方で行わなくてはならない
必然性が見えないので、そもそも渡す必要が無いのではないかと言う話に
なっていると思うのですが、質問されているご自身はその部分を理解して
作業を行なっていますか?

メインフレームはDoc-Viewアーキテクチャを使う場合、
そのアプリケーションのメインウインドウになる物なので
スプラッシュウインドウを出すライブラリ側で生成するのは
かなり違和感を覚えます。
ごく一部しか担当していないライブラリがアプリ全体を握っている部分まで
管理しているようなイメージになりますから。
一般的な考え方からすると生成したレベルで破棄も行なうと思うので
それならメインウインドウを破棄するのにスプラッシュウインドウを
出すライブラリの関数を呼び出して行うのかと言う話です。


返信引用
hirocco
 hirocco
(@hirocco)
ゲスト
結合: 14年前
投稿: 138
 

ビジュアルだけならCMainFrameを生成する前に
モーダルダイアログを生成,そしてタイマで
一定時間経過後にモーダルダイアログ終了させてから通常処理
初期化とかそういうのさせない
っていうのはどうでしょう

親子も崩れないしね


返信引用
ねこ
 ねこ
(@ねこ)
ゲスト
結合: 22年前
投稿: 94
Topic starter  

スプラッシュダイアログのLIBで、フレーム生成をしないようにしました。

ちょっと忙しくて、返事が遅くなってしまい、申し訳ありません。
みなさん、ありがとうございました(><)/


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました