MFCをSDKで使用 – プログラミング – Home

通知
すべてクリア

[解決済] MFCをSDKで使用


DVE
 DVE
(@DVE)
ゲスト
結合: 18年前
投稿: 7
Topic starter  

MFCで作成したプログラムをライブラリ化してSDKで作成したプログラムで使用すること
は可能なのでしょうか?

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


引用未解決
トピックタグ
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

MFC共有(レギュラー)DLLにすれば可能です。


返信引用
DVE
 DVE
(@DVE)
ゲスト
結合: 18年前
投稿: 7
Topic starter  

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


返信引用
ぬふや
 ぬふや
(@ぬふや)
ゲスト
結合: 18年前
投稿: 34
 

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

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


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

> MFC共有DLLにするにはどうすればいいんですか?

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

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

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

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


返信引用
DVE
 DVE
(@DVE)
ゲスト
結合: 18年前
投稿: 7
Topic starter  

エラーの内容は80件ほど出ていて全部は書ききれないので一部だけ抜粋します。

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

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

という感じがずっと続いています。
よろしくお願いします。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

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


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

その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
 DVE
(@DVE)
ゲスト
結合: 18年前
投稿: 7
Topic starter  

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


返信引用
DVE
 DVE
(@DVE)
ゲスト
結合: 18年前
投稿: 7
Topic starter  

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


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

> AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
> を入れるといいんだと思いますが、これを入れるとDllMainが再定義されてエラーに

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

ソースの中で

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

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

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


返信引用
DVE
 DVE
(@DVE)
ゲスト
結合: 18年前
投稿: 7
Topic starter  

DLLの作り方が間違えていたんですね。
作り直したらうまくいきました。
みなさんありがとうございました。


返信引用
DVE
 DVE
(@DVE)
ゲスト
結合: 18年前
投稿: 7
Topic starter  

チェック入れ忘れた。
たびたび失礼しました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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