MFCをSDKで使用

[戻る]
DVE 2007/02/07(水) 18:08:42
MFCで作成したプログラムをライブラリ化してSDKで作成したプログラムで使用すること
は可能なのでしょうか?

どうかご教授お願いします。
XPの.NET2003で作成しています。

Kerry 2007/02/07(水) 18:41:41
MFC共有(レギュラー)DLLにすれば可能です。

DVE 2007/02/07(水) 18:54:50
基本的な質問かもしれませんが、MFC共有DLLにするにはどうすればいいんですか?
自分が今やってる方法ではDLL化はできても、SDKで作成したプログラムで使用するとコ
ンパイルエラーが出てきます。
よろしくお願いします。

ぬふや 2007/02/07(水) 22:26:14
どんなエラーが出るのか詳しくお願いします。
コンパイルエラーなのか、リンクエラーなのか、実行時エラーなのか。
場合によってはMFCがSDKアプリでも必要があると思います。
例えば、自作ライブラリのヘッダでMFCのクラスなどを使っているのなら、SDKで
作っているプログラムのほうでその定義が出来ませんので、MFCが必要になること
もあると思います。

自作ライブラリがエクスポートする部分に全くMFCの要素が無いのならば、SDK
アプリからヘッダを読み込むときに不要なMFCのヘッダを除外させる必要があるか
もしれません。
エクスポートする部分とヘッダを分離して、自作ライブラリ側では両方を、SDKア
プリではエクスポートする部分のみをインクルードするなどです。
マクロでやったほうがいいかもしれません。

Kerry 2007/02/08(木) 00:53:31
> MFC共有DLLにするにはどうすればいいんですか?

ヘルプを「DLL」や「ダイナミック リンク ライブラリ」などのキーワードで
検索すれば詳細な情報は得られると思います。作り方も。

> 自分が今やってる方法ではDLL化はできても、SDKで作成した
> プログラムで使用するとコンパイルエラーが出てきます。

この情報だけでは「なんかおかしいコードを書いてるのでしょう」
としか言い様がありません。

どのようなコードを書いてるのかとか、せめてエラーの内容とか、
もう少し詳しい情報を提示したほうが良いでしょう。

DVE 2007/02/08(木) 14:54:19
エラーの内容は80件ほど出ていて全部は書ききれないので一部だけ抜粋します。

class **** : public CDialog
{
public:
//コンストラクタ
 ****(CWnd* pParent = NULL);
っというところで

error C2504: 'CDialog' : 定義されていない基本クラスが宣言されています。
error C2460: '****::CWnd' : クラスまたは構造体は、'****' で既に宣言されていま
す。
error C2501: '****::pParent' : 識別名を宣言するのに、型が指定されていません。
error C2864: 'pParent' : const 静的整数データ メンバ以外をクラスまたは構造体内
で初期化することはできません。
…
という感じがずっと続いています。
よろしくお願いします。

Ban 2007/02/08(木) 15:32:34
 CDialogとか、CWndとかのMFC固有のものを、直接、非MFCのものから参照させてはいけません。
そのままそういうものが非MFCのアプリから使えるか、というご質問なら「無理」です。
そういうものを見せずに使えるような形にしてあげる必要があります。

tetrapod 2007/02/08(木) 16:50:32
そのclass **** : public CDialogっつーコードはどこに書いたのだろうか。
・MFC を使う DLL 中
・MFC を使わない EXE 中
前者なら #include 系のミス (というか、キホンがわかってない証拠)
後者なら無理 (このコードがコンパイルできる = MFC を使うってこと)

Ban さんのご提案の意味はこんな風にしろ、っつーこと。

MFC を使う DLL 中での公開関数
declspec(dllexport) int DoHogeDialog(int arg1, int arg2, T arg3) {
  CHogeDlg dlg;
  dlg.SetArgs(/*必要なargを使う*/);
  if (dlg.DoModal()==IDOK) {
     // 必要なargを使う
  }
  return ****;
};

MFC を使わない EXE 中からは単純に DoHogeDialog() を呼ぶだけ、っと。

DVE 2007/02/08(木) 18:27:53
みなさんありがとうございました。
tetrapod さんと Ban さんの方法でDLLは使用出来るようになりました。
しかしコンストラクタのあとOnInitDialogの処理にいくまでに、afxwin1.inlという所の
26行目でDebug Assertion Failedというエラーが出てきて落ちてしまいます。
どうしたらいいんでしょうか、よろしくお願いします。

DVE 2007/02/08(木) 19:35:33
多分
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
を入れるといいんだと思いますが、これを入れるとDllMainが再定義されてエラーになっ
てしまいます。
よろしくお願いします。

Kerry 2007/02/08(木) 19:47:04
> AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
> を入れるといいんだと思いますが、これを入れるとDllMainが再定義されてエラーに

それは、MFC拡張DLLではないですか?

ソースの中で

  CWinApp派生クラスが定義されているのがMFC共有DLL (←こっちは非MFCから使える)

  DllMain関数が定義されているのがMFC拡張DLL (←こっちは非MFCからは使えない)

プロジェクトを新規作成するときに選択できたと思いますけど。

DVE 2007/02/08(木) 21:46:19
DLLの作り方が間違えていたんですね。
作り直したらうまくいきました。
みなさんありがとうございました。

DVE 2007/02/08(木) 21:47:22
[[解決]]
チェック入れ忘れた。
たびたび失礼しました。

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