開発環境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ファイルの中にオブジェクトとして組み込まれるように
何か設定等が必要なのでしょうか?
>上記のCreateで落ちます。
どんなふうに?
エラーコードなり、ワトソンなり、アーサッションなり
なんかあるでしょう?
VCのバージョンは?
スタティックリンクで実現したい質問?
>libファイルを作るときには、リソースも一緒に
リンクオプションに指定してやれば問題なくリンクできると思いますけど?
スタティックライブラリは、単にコンパイル済みのC/C++のコードをまとめた
ものなので、リソースを含めることはできません。
>スタティックライブラリは、単にコンパイル済みのC/C++のコードをまとめた
>ものなので、リソースを含めることはできません。
すいません。ふと疑問に思ったので質問しちゃいます。
MFC アプリを「MFC のスタティックライブラリを使用」で作成した場合、
作成した EXE に MFC 固有のリソースが組み込まれますよね?
例えば、印刷プレビューのダイアログバーとか。
あれは、どのようにして組み込まれるんでしょう?
> あれは、どのようにして組み込まれるんでしょう?
メニューの「表示」-「インクルードファイルの設定」を開くと、
#include afxres.h
とか、
#include afxres.rc
といった記述がありますが、
ここでリソースファイルに組み込まれています。
dairygoodsさん、回答ありがとうございます。
>#include afxres.h
>とか、
>#include afxres.rc
なるほど、インクルードでプログラムと一緒にコンパイルされるってことですね。
ひとつ利口になりました。(^^)
説明不足で申し訳ありません。
もう少し具体的に落ちている個所を説明します。
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で失敗して(落ちていて)リソースで問題があるのではないかと
思っているのですが、何をどう調べれば、何が悪いのかさっぱりわかりません。
どなたか同じような経験のある方、ご教授ください。
ちなみに、
>スタティックリンクで実現したい質問?
スタティックリンクであってもなくてもどちらでもかまいません。
簡単にいうと最終的な目的は、
「ダイアログを表示する機能をライブラリで実現したい」です。
MFCは使っていないのでよく判りませんが。
AfxGetResourceHandleから戻ってみたり、色々Grepしていって……
AFX_MODULE_STATEとやらにたどり着いたのですが、関係あるのでしょうか?
とりあえず、「AFX_MODULE_STATE」でググって、
http://www.microsoft.com/japan/developer/library/vcmfc/_mfc_afx_manage_state.htm
に。
で……
>デフォルトでは、MFC はメイン アプリケーションのリソース ハンドルを使用して、リ
ソース テンプレートをロードします。
の一文が気になるところではありますが。
…なんかハズした気がする(^_^;)
とりあえず、AfxGetResourceHandle()は
AfxGetModuleState()->m_hCurrentResourceHandleを返そうとしているようです。
NULLだった場合はASSERTになりますが。
m_hCurrentResourceHandleは…APPの起動時か
Dllの読み込み時(DllMainでDLL_PROCESS_ATTACHの時)に設定されるようです。
瀬戸っぷさん
ありがとうございます。
これを読んで気になるのは、以下です。
>適切なハンドルを使用するには、モジュール状態を切り替える必要があります。
適切なハンドルの取得に失敗しているので、
Create(略)の前に
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
を追加してみましたが、同じでした。
この関数もよくわかりませんでした。
>プロジェクトAがあり、これは、ライブラリを生成するための
>プロジェクトです。
あの~。
誰か言うかしら、と思って黙ってたですが、
ここで言っている「ライブラリを生成するためのプロジェクト」って、
lib のことなのか dll のことなのか私にはよくわからないんですけど。
lib のことだったら、dairygoods さんの回答から、解決方法は決まった
ようなものではないかな、って思ったんですが。
dll の場合だったら MFCレギュラーdll と MFC拡張dll ではリソースの
扱い方が違ってくるから、それを先に明示してくれなきゃ、まるで話にならない、
...と思うです。
>スタティックリンクであってもなくてもどちらでもかまいません。
>簡単にいうと最終的な目的は、
>「ダイアログを表示する機能をライブラリで実現したい」です。
あ、別に何でもいいのか...失礼しました。
んじゃ、MFC 拡張 dll ってことにして作り始めてみればいいんじゃないですかね。
#アプリ側も同一バージョンの MFC dll を使用する MFC アプリに制限されるけど
pbyteさん、ありがとうございます。
またまた説明不足でごめんなさい。
最終的には、ライブラリ(lib)をつくることが目的です。
アプリ側では、MFCのdllが使えません。
dairygoodsさん、ありがとうございます。
「表示」-「インクルードファイルの設定」は、以下のようになっています。
・シンボル用のヘッダーファイル
resource.h
・読み取り専用のヘッダーファイル
#include afxres.h
となっているため、問題なくリソースがコンパイルされて、
組み込まれていると思います。
woodさんやdairygoodsさんに言われて
何となく分かってきたのですが、結局のところ、
リソースがライブラリに組み込まれていないことが
問題なのですか?自分で何が悪いのかわかっていないのですが、、、
woodさん
>リンクオプションに指定してやれば問題なくリンクできると思いますけど?
「プロジェクト」-「設定」の「リンク」タブには、
それらしき設定が見当たらなかったのですが、もう少し教えてください。
よろしくお願いします。
>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++以前の話)をしてください
最近の解説書には、書いていないのかも知れませんけど・・・
> woodさんやdairygoodsさんに言われて
> 何となく分かってきたのですが、結局のところ、
> リソースがライブラリに組み込まれていないことが
> 問題なのですか?自分で何が悪いのかわかっていないのですが、、、
は? roccyさんは最初の書き込みで、
>> libファイルを作るときには、リソースも一緒に
>> libファイルの中にオブジェクトとして組み込まれるように
>> 何か設定等が必要なのでしょうか?
と書いていますが、リソースがライブラリに含まれないことが
原因だと認識しているのではないのですか?
こちらは、それを前提に返答したに過ぎないのですが。
> 「表示」-「インクルードファイルの設定」は、以下のようになっています。
> ・シンボル用のヘッダーファイル
> resource.h
> ・読み取り専用のヘッダーファイル
> #include afxres.h
> となっているため、問題なくリソースがコンパイルされて、
> 組み込まれていると思います。
その通りですが、これによってroccyさんの作ったリソースが取り込まれ
ているという話ではありません。一連の回答を良く読んでください。