ライブラリのCreateで落ちる

[戻る]
roccy 2004/07/30(金) 17:47:51
開発環境VC++、Windows2000、MFC


プロジェクトAがあり、これは、ライブラリを生成するための
プロジェクトです。
Debuglog.libには、CreateMonitor()という関数があり、
その中で、

CDialog* pDlg = new CDialog;
pDlg->Create(IDD_DLG_DEBUGLOG,NULL);

をしています。

別のプロジェクトBをつくり、このライブラリを
リンクし、CreateMonitor()という関数を呼ぶと
上記のCreateで落ちます。

プロジェクトAには、
resource.hがあり、IDD_DLG_DEBUGLOGが定義されています。

libファイルを作るときには、リソースも一緒に
libファイルの中にオブジェクトとして組み込まれるように
何か設定等が必要なのでしょうか?

wood 2004/07/31(土) 07:17:18
>上記のCreateで落ちます。
どんなふうに?
エラーコードなり、ワトソンなり、アーサッションなり
なんかあるでしょう?

VCのバージョンは?

スタティックリンクで実現したい質問?

>libファイルを作るときには、リソースも一緒に
リンクオプションに指定してやれば問題なくリンクできると思いますけど?

dairygoods 2004/07/31(土) 11:26:05
スタティックライブラリは、単にコンパイル済みのC/C++のコードをまとめた
ものなので、リソースを含めることはできません。

pbyte 2004/07/31(土) 12:00:17
>スタティックライブラリは、単にコンパイル済みのC/C++のコードをまとめた
>ものなので、リソースを含めることはできません。

すいません。ふと疑問に思ったので質問しちゃいます。

MFC アプリを「MFC のスタティックライブラリを使用」で作成した場合、
作成した EXE に MFC 固有のリソースが組み込まれますよね?
例えば、印刷プレビューのダイアログバーとか。
あれは、どのようにして組み込まれるんでしょう?

dairygoods 2004/07/31(土) 13:03:12
> あれは、どのようにして組み込まれるんでしょう?

メニューの「表示」-「インクルードファイルの設定」を開くと、
#include "afxres.h"
とか、
#include "afxres.rc"
といった記述がありますが、
ここでリソースファイルに組み込まれています。

pbyte 2004/07/31(土) 14:09:29
dairygoodsさん、回答ありがとうございます。

>#include "afxres.h"
>とか、
>#include "afxres.rc"

なるほど、インクルードでプログラムと一緒にコンパイルされるってことですね。
ひとつ利口になりました。(^^)

roccy 2004/08/02(月) 00:06:03
説明不足で申し訳ありません。
もう少し具体的に落ちている個所を説明します。

Createで落ちるといっていた部分
_AFXWIN_INLINE BOOL CDialog::Create(UINT nIDTemplate, CWnd* pParentWnd)
    { return Create( MAKEINTRESOURCE(nIDTemplate), pParentWnd); }
このときの引数
nIDTemplateは、2099
pParentWndは、0x00000000

Createの中で、_AfxCheckDialogTemplateがコールされており、
_AfxCheckDialogTemplate(LPCTSTR lpszResourse, BOOL bInvisibleChild)
その引数
lpszResourseは、0x00000833
bInvisibleChildは、0

_AfxCheckDialogTemplateの中でAfxFindResourceHandleがコールされており、
AfxFindResourceHandle(LPCTSTR lpszName, LPCTSTR lpszType)
その引数
lpszNameは、0x00000833
lpszTypeは、0x00000005

AfxFindResourceHandleの中で、AfxGetModuleState()がコールされていますが、
戻り値で得られるAFX_MODULE_STATE* pModuleStateは、0x10038f48になっており、
問題ない?ように思えます。

そのあとのAfxGetResourceHandle()で落ちます。
「赤バッテンの『中止』『再試行』『無視』

つまり、Createで失敗して(落ちていて)リソースで問題があるのではないかと
思っているのですが、何をどう調べれば、何が悪いのかさっぱりわかりません。
どなたか同じような経験のある方、ご教授ください。

ちなみに、
>スタティックリンクで実現したい質問?
スタティックリンクであってもなくてもどちらでもかまいません。
簡単にいうと最終的な目的は、
「ダイアログを表示する機能をライブラリで実現したい」です。

瀬戸っぷ [E-Mail] 2004/08/02(月) 00:38:51
MFCは使っていないのでよく判りませんが。

AfxGetResourceHandleから戻ってみたり、色々Grepしていって……
AFX_MODULE_STATEとやらにたどり着いたのですが、関係あるのでしょうか?
とりあえず、「AFX_MODULE_STATE」でググって、
http://www.microsoft.com/japan/developer/library/vcmfc/_mfc_afx_manage_state.htm
に。
で……
>デフォルトでは、MFC はメイン アプリケーションのリソース ハンドルを使用して、リ
ソース テンプレートをロードします。
の一文が気になるところではありますが。

瀬戸っぷ [E-Mail] 2004/08/02(月) 01:04:43
…なんかハズした気がする(^_^;)

とりあえず、AfxGetResourceHandle()は
AfxGetModuleState()->m_hCurrentResourceHandleを返そうとしているようです。
NULLだった場合はASSERTになりますが。
m_hCurrentResourceHandleは…APPの起動時か
Dllの読み込み時(DllMainでDLL_PROCESS_ATTACHの時)に設定されるようです。

roccy 2004/08/02(月) 01:52:52
瀬戸っぷさん
ありがとうございます。

これを読んで気になるのは、以下です。
>適切なハンドルを使用するには、モジュール状態を切り替える必要があります。
適切なハンドルの取得に失敗しているので、
Create(略)の前に
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
を追加してみましたが、同じでした。
この関数もよくわかりませんでした。

pbyte [HomePage] 2004/08/02(月) 11:17:05
>プロジェクトAがあり、これは、ライブラリを生成するための
>プロジェクトです。

あの〜。
誰か言うかしら、と思って黙ってたですが、
ここで言っている「ライブラリを生成するためのプロジェクト」って、
lib のことなのか dll のことなのか私にはよくわからないんですけど。

lib のことだったら、dairygoods さんの回答から、解決方法は決まった
ようなものではないかな、って思ったんですが。
dll の場合だったら MFCレギュラーdll と MFC拡張dll ではリソースの
扱い方が違ってくるから、それを先に明示してくれなきゃ、まるで話にならない、

...と思うです。

pbyte 2004/08/02(月) 13:56:34
>スタティックリンクであってもなくてもどちらでもかまいません。
>簡単にいうと最終的な目的は、
>「ダイアログを表示する機能をライブラリで実現したい」です。

あ、別に何でもいいのか...失礼しました。

んじゃ、MFC 拡張 dll ってことにして作り始めてみればいいんじゃないですかね。
#アプリ側も同一バージョンの MFC dll を使用する MFC アプリに制限されるけど

roccy 2004/08/03(火) 02:09:16
pbyteさん、ありがとうございます。
またまた説明不足でごめんなさい。
最終的には、ライブラリ(lib)をつくることが目的です。
アプリ側では、MFCのdllが使えません。

dairygoodsさん、ありがとうございます。
「表示」-「インクルードファイルの設定」は、以下のようになっています。
・シンボル用のヘッダーファイル
resource.h
・読み取り専用のヘッダーファイル
#include "afxres.h"
となっているため、問題なくリソースがコンパイルされて、
組み込まれていると思います。

woodさんやdairygoodsさんに言われて
何となく分かってきたのですが、結局のところ、
リソースがライブラリに組み込まれていないことが
問題なのですか?自分で何が悪いのかわかっていないのですが、、、

woodさん
>リンクオプションに指定してやれば問題なくリンクできると思いますけど?
「プロジェクト」−「設定」の「リンク」タブには、
それらしき設定が見当たらなかったのですが、もう少し教えてください。
よろしくお願いします。

wood 2004/08/03(火) 06:01:38
>roccy 2004/07/30(金) 17:47:51
>開発環境VC++、Windows2000、MFC

>roccy 2004/08/03(火) 02:09:16
>アプリ側では、MFCのdllが使えません。

話の矛盾を説明してください

少なくとも私は、
>roccy 2004/08/03(火) 02:09:16
の話が出ると思い
>wood 2004/07/31(土) 07:17:18>スタティックリンクで実現したい質問?

いつになったらバージョン情報、記入してくれるのかな?

ただ「LIB」を作るだけなら、格ソースを1つずつコンパイル(ビルドではありませ
ん)
して、「OBJ]を生成してください
次にコマンドラインから「LIB.EXE」を使って何個になったかわからない「OB
J」をまとめて「LIB」にしてください
ただし、実用性のあるものになるかどうかは、あなたしだいです

>「プロジェクト」−「設定」の「リンク」タブには、
>それらしき設定が見当たらなかったのですが、もう少し教えてください。
甘えすぎ、調べなさ過ぎ!!
MSDNやら、HELPやら、あるでしょ!!

アプリケーションはどのようにして、ソースからobjを経てexeになるのか
基礎学習(C・C++以前の話)をしてください

最近の解説書には、書いていないのかも知れませんけど・・・

dairygoods 2004/08/03(火) 11:10:35
> woodさんやdairygoodsさんに言われて
> 何となく分かってきたのですが、結局のところ、
> リソースがライブラリに組み込まれていないことが
> 問題なのですか?自分で何が悪いのかわかっていないのですが、、、

は? roccyさんは最初の書き込みで、

>> libファイルを作るときには、リソースも一緒に
>> libファイルの中にオブジェクトとして組み込まれるように
>> 何か設定等が必要なのでしょうか?

と書いていますが、リソースがライブラリに含まれないことが
原因だと認識しているのではないのですか?
こちらは、それを前提に返答したに過ぎないのですが。


> 「表示」-「インクルードファイルの設定」は、以下のようになっています。
> ・シンボル用のヘッダーファイル
> resource.h
> ・読み取り専用のヘッダーファイル
> #include "afxres.h"
> となっているため、問題なくリソースがコンパイルされて、
> 組み込まれていると思います。

その通りですが、これによってroccyさんの作ったリソースが取り込まれ
ているという話ではありません。一連の回答を良く読んでください。

pbyte 2004/08/04(水) 12:13:26
>最終的には、ライブラリ(lib)をつくることが目的です。
>アプリ側では、MFCのdllが使えません。

アプリ側で MFC を使わないとしても、アプリ側の開発環境では
lib が想定しているのと同一バージョンのMFC がリンク時に必要になるはず。
アプリも MFC を使うなら別バージョンの MFC は使えない。
と思うけど、それはいいのかな。

また、
CDialog::Create() の前にモジュール状態のセットアップとか、
何らかの MFC 初期化処理が必要なんじゃないか?
とか、
メッセージループをどのように供給してやれば CDialog が問題なく
動いてくれるだろう?
とか、
そういう周辺のことまでちゃんと考えてやってるんでしょうか。

自分なら、アプリが 非MFC っていうことなら、
・MFC レギュラー dll にする
・MFC を一切使わない
のどっちかにします。

#MFC AppWizard がサポートしてない形式のものは、
#よほど腕に自信がある(他人に頼らないでもできる)っていうのでなければ、
#やらないほうがいいと思います。

roccy 2004/08/05(木) 03:12:30
[[解決]]
うーん
どうも奥が深いのと私の知識不足、努力不足が露呈してしまいました。
もう少しゆっくり考えてまだわからなければ、
また、質問します。

参考になる意見や私の知らない知識を聞くことができました。
どうもありがとうございます。

ひとまず、MFCレギュラーdllにしてやってみます。
あとは、MFCスタティックリンクでやってみます。

あとは、もう少し勉強します知識がないので
意味不明な質問になってしまい、皆さんを困惑させてしまいました
すいません。

libプロジェクト側で作ったリソースの中間ファイルをアプリ側でリンク
させてもAfxGetResourceHandle()で落ちます。

>CDialog::Create() の前にモジュール状態のセットアップとか、
>何らかの MFC 初期化処理が必要なんじゃないか?
この当たりでもう少し調べて見ます。

dairygoodsさん、pbyteさん、woodさん、
ありがとうございました。
ひとまず、解決にします。

ちなみにVC++6.0

古いスレッドには追加発言できません。