みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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;
}

投稿日時 - 2009-06-09 17:24:38

QNo.5030073

すぐに回答ほしいです

質問者が選んだベストアンサー

まず、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

投稿日時 - 2009-06-09 21:38:44

お礼

有益な情報をありがとうございます

>まず、DLLとEXEの違いについてわかっていますか?
その点は、多分大丈夫です
MFCのDLLをVBから呼ぶのは、問題なく出来ます

>さらに, DLL側でメッセージ処理を行わせるには
 いくつかの注意点があります。

リンク先をざっと読んでみましたが、大体意味はわかりました
ここは、今一度真剣に取り組む必要がありそうですね

>ただ単にVBからVC++のアプリを呼び出したいなら
 わざわざDLLにするよりも
 Shell関数のほうが簡単だと思います

確かに!その通りです
私もそれでいけばいいかな???と思っていたのですが・・・
プログラマーから、DLLで欲しいと要求されましたので、
ならDLLにしてあげましょうと、ちょこっと書いてみたら・・・あらら・・・

assertに引っかかるのですから、やってはいけないことをしているのは分かっています
呼び出しのコーディングレベルの問題でなく、構造的な問題が絡んでいるとは踏んでいましたが・・・奥が深そうです

もうちょっと頑張ってみたいと思います

投稿日時 - 2009-06-10 01:52:28

ANo.1

このQ&Aは役に立ちましたか?

5人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

ダイアログのDLL化はリソースの問題とかもあるので、一筋縄ではいきません。
単に、子プロセスとして呼ぶのではだめなのかもう一度確認したほうがいいとおもいます。

投稿日時 - 2009-06-10 09:42:40

お礼

>ダイアログのDLL化はリソースの問題とかもあるので、一筋縄ではいきません。

そう思っていましたが…
#1の方のアドバイスを見て、ちょこちょこっと組んでみたら
あらあら…ものの10分で、動くDLLになってしまいました

やり方が無い訳でなく、難しい訳でもなく、単に知らなかった
いやはや、お恥ずかしい限りです(*^_^*)

>子プロセスとして呼ぶのではだめなのか

プログラマーたちからしてみれば、DLLで関数として簡単に呼び出せた方がうちの場合とても喜ばれます
Win32DLLのインターフェイスに準拠していれば、Winの上ならどな言語からでも使えますので、あとはお好きに使ってくださいで済みますので…

作る側も、面倒なことが必要無いんで楽でした…
ほんと馬鹿みたいに簡単です

やってみてください

投稿日時 - 2009-06-11 14:21:28

あなたにオススメの質問