ライブラリのCreateで落ちる – プログラミング – Home

ライブラリのCreateで落ちる
 
通知
すべてクリア

[解決済] ライブラリのCreateで落ちる

固定ページ 1 / 2

roccy
 roccy
(@roccy)
ゲスト
結合: 23年前
投稿: 82
Topic starter  

開発環境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
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

>上記のCreateで落ちます。
どんなふうに?
エラーコードなり、ワトソンなり、アーサッションなり
なんかあるでしょう?

VCのバージョンは?

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

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


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

スタティックライブラリは、単にコンパイル済みのC/C++のコードをまとめた
ものなので、リソースを含めることはできません。


返信引用
pbyte
 pbyte
(@pbyte)
ゲスト
結合: 20年前
投稿: 5
 

>スタティックライブラリは、単にコンパイル済みのC/C++のコードをまとめた
>ものなので、リソースを含めることはできません。

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

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


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

> あれは、どのようにして組み込まれるんでしょう?

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


返信引用
pbyte
 pbyte
(@pbyte)
ゲスト
結合: 20年前
投稿: 5
 

dairygoodsさん、回答ありがとうございます。

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

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


返信引用
roccy
 roccy
(@roccy)
ゲスト
結合: 23年前
投稿: 82
Topic starter  

説明不足で申し訳ありません。
もう少し具体的に落ちている個所を説明します。

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

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


返信引用
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 22年前
投稿: 160
 

MFCは使っていないのでよく判りませんが。

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


返信引用
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 22年前
投稿: 160
 

…なんかハズした気がする(^_^;)

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


返信引用
roccy
 roccy
(@roccy)
ゲスト
結合: 23年前
投稿: 82
Topic starter  

瀬戸っぷさん
ありがとうございます。

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


返信引用
pbyte
 pbyte
(@pbyte)
ゲスト
結合: 20年前
投稿: 5
 

>プロジェクトAがあり、これは、ライブラリを生成するための
>プロジェクトです。

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

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

...と思うです。


返信引用
pbyte
 pbyte
(@pbyte)
ゲスト
結合: 20年前
投稿: 5
 

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

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

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


返信引用
roccy
 roccy
(@roccy)
ゲスト
結合: 23年前
投稿: 82
Topic starter  

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

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

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

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


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

>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
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

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

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

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

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

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

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


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

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