- ベストアンサー
MFCのexeのプログラムを MFCのdllに書き換えたい
VC++6.0を使用しています 新規作成 MFC AppWizard(exe) 新規 OK [ステップ1] ダイアログベース 次へ [ステップ2/4] 次へ [ステップ3/4] 次へ [ステップ4/4] 終了 で作られた、雛型のexeをそっくりMFCのDLLに書き換えたい と考えています exeで作られたアプリを他のユーザーがVB6.0からDLLとして呼び出したいので書き換えて欲しいと頼まれました MFCのDLLも雛型は簡単に出来上がるのですが 以下の関数を独立したオブジェクトにして、VB6.0からDLLの関数VBFUNC1として呼び出したいのですが、VBから呼び出すと AfxEnableControlContainer();でアサートで引っ掛かってしまいます ダイアログを使用したMFCのEXEをDLLとして使う場合の、コーディングについてご指南ください BOOL CAaaApp::VBFUNC1() //BOOL CAaaApp::InitInstance() { AfxEnableControlContainer(); #ifdef _AFXDLL Enable3dControls(); #else Enable3dControlsStatic(); #endif CAaaDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); if (nResponse == IDOK) { } else if (nResponse == IDCANCEL) { } return FALSE; }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
まず、DLLとEXEの違いについてわかっていますか? DLLとは"他のEXEやDLLに対して機能を提供するもの"です。 単体では役に立たず、直接・間接にEXEから呼ばれて役に立つものです。 DLLを作成するには、DLLの役割を明確にしなければなりません。 通常、関数の形で提供することが多いですが、 クライアントがC++であれば、C++クラスを提供することも可能です。 この提供することを"エクスポート"と呼びます。 エクスポートするためには特別な指定が必要です。 詳細はこちらで参考になります http://hp.vector.co.jp/authors/VA023539/tips/dll/001.htm なお、VB6がクライアントの場合、DEFファイルも必要です。 http://www.geocities.jp/i_love_balard/myhome/vbdll.html さらに, DLL側でメッセージ処理を行わせるには いくつかの注意点があります。 http://msdn.microsoft.com/ja-jp/library/30c674tx.aspx 色々大変です。 ただ単にVBからVC++のアプリを呼び出したいなら わざわざDLLにするよりも Shell関数のほうが簡単だと思います。 http://hanatyan.sakura.ne.jp/vbhlp/tap_shell.htm
その他の回答 (1)
- titokani
- ベストアンサー率19% (341/1726)
ダイアログのDLL化はリソースの問題とかもあるので、一筋縄ではいきません。 単に、子プロセスとして呼ぶのではだめなのかもう一度確認したほうがいいとおもいます。
お礼
>ダイアログのDLL化はリソースの問題とかもあるので、一筋縄ではいきません。 そう思っていましたが… #1の方のアドバイスを見て、ちょこちょこっと組んでみたら あらあら…ものの10分で、動くDLLになってしまいました やり方が無い訳でなく、難しい訳でもなく、単に知らなかった いやはや、お恥ずかしい限りです(*^_^*) >子プロセスとして呼ぶのではだめなのか プログラマーたちからしてみれば、DLLで関数として簡単に呼び出せた方がうちの場合とても喜ばれます Win32DLLのインターフェイスに準拠していれば、Winの上ならどな言語からでも使えますので、あとはお好きに使ってくださいで済みますので… 作る側も、面倒なことが必要無いんで楽でした… ほんと馬鹿みたいに簡単です やってみてください
お礼
有益な情報をありがとうございます >まず、DLLとEXEの違いについてわかっていますか? その点は、多分大丈夫です MFCのDLLをVBから呼ぶのは、問題なく出来ます >さらに, DLL側でメッセージ処理を行わせるには いくつかの注意点があります。 リンク先をざっと読んでみましたが、大体意味はわかりました ここは、今一度真剣に取り組む必要がありそうですね >ただ単にVBからVC++のアプリを呼び出したいなら わざわざDLLにするよりも Shell関数のほうが簡単だと思います 確かに!その通りです 私もそれでいけばいいかな???と思っていたのですが・・・ プログラマーから、DLLで欲しいと要求されましたので、 ならDLLにしてあげましょうと、ちょこっと書いてみたら・・・あらら・・・ assertに引っかかるのですから、やってはいけないことをしているのは分かっています 呼び出しのコーディングレベルの問題でなく、構造的な問題が絡んでいるとは踏んでいましたが・・・奥が深そうです もうちょっと頑張ってみたいと思います