• ベストアンサー

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

  • joqr
  • お礼率92% (77/83)

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

  • ベストアンサー
  • BLK314
  • ベストアンサー率55% (84/152)
回答No.1

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

joqr
質問者

お礼

有益な情報をありがとうございます >まず、DLLとEXEの違いについてわかっていますか? その点は、多分大丈夫です MFCのDLLをVBから呼ぶのは、問題なく出来ます >さらに, DLL側でメッセージ処理を行わせるには  いくつかの注意点があります。 リンク先をざっと読んでみましたが、大体意味はわかりました ここは、今一度真剣に取り組む必要がありそうですね >ただ単にVBからVC++のアプリを呼び出したいなら  わざわざDLLにするよりも  Shell関数のほうが簡単だと思います 確かに!その通りです 私もそれでいけばいいかな???と思っていたのですが・・・ プログラマーから、DLLで欲しいと要求されましたので、 ならDLLにしてあげましょうと、ちょこっと書いてみたら・・・あらら・・・ assertに引っかかるのですから、やってはいけないことをしているのは分かっています 呼び出しのコーディングレベルの問題でなく、構造的な問題が絡んでいるとは踏んでいましたが・・・奥が深そうです もうちょっと頑張ってみたいと思います

その他の回答 (1)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.2

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

joqr
質問者

お礼

>ダイアログのDLL化はリソースの問題とかもあるので、一筋縄ではいきません。 そう思っていましたが… #1の方のアドバイスを見て、ちょこちょこっと組んでみたら あらあら…ものの10分で、動くDLLになってしまいました やり方が無い訳でなく、難しい訳でもなく、単に知らなかった いやはや、お恥ずかしい限りです(*^_^*) >子プロセスとして呼ぶのではだめなのか プログラマーたちからしてみれば、DLLで関数として簡単に呼び出せた方がうちの場合とても喜ばれます Win32DLLのインターフェイスに準拠していれば、Winの上ならどな言語からでも使えますので、あとはお好きに使ってくださいで済みますので… 作る側も、面倒なことが必要無いんで楽でした… ほんと馬鹿みたいに簡単です やってみてください

関連するQ&A

  • メッセージボックスが表示されないのですが?

    WIN98 VC++6.0 MFCにて mmmというプロジェクト名でウィザードに従いダイアログベースのPGを作りました。 下記のようにコードの2箇所にAfxMessageBox("3",MB_OK);を追加しましたが、どちらもメッセージボックスが表示されません。 どうしてなのでしょうか? お分かりも方是非教えてください。 ************************** BOOL CMmmApp::InitInstance() { AfxEnableControlContainer(); #ifdef _AFXDLL Enable3dControls(); #else Enable3dControlsStatic(); #endif CMmmDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); AfxMessageBox("3",MB_OK);//■追加 if (nResponse == IDOK) { AfxMessageBox("3",MB_OK);//■追加 } else if (nResponse == IDCANCEL) { } // ダイアログが閉じられてからアプリケーションのメッセージ ポンプを開始するよりは、 // アプリケーションを終了するために FALSE を返してください。 return FALSE; }

  • 連続してダイアログを表示したい?

    VC++6.0を使用しています。 以下のようなコードでダイアログを連続して表示しようと思っています。1番目のダイアログを表示してOKボタンを押下後(このときこのダイアログは消えて)、2番目のダイアログを表示したいと思っているのですが2番目が表示できません。(1番目のところをコメントにすれば2番目は表示できます。)どうして2番目のダイアログが表示できないのでしょうか? // 1番目のダイアログ   CTest1Dlg dlg;   m_pMainWnd = &dlg;   int nResponse1 =dlg.DoModal(); // 2番目のダイアログ   CTest2Dlg dlg;   m_pMainWnd = &dlg;   int nResponse2 =dlg.DoModal(); //   if (nResponse1 == IDOK) {   :以下省略 これだけの情報でアドバイスができますでしょうか? すみません。よろしくお願い致します。

  • CXXXApp::InitInstance内でDLLの呼び出し

    CXXXApp::InitInstance内でDLLの呼び出しをしています。 呼び出すDLLは、MFCの共有DLLで作成しました。 DLLの内容は、単純にダイアログを表示しているだけです。 そこで、問題が発生しています。 DLLを呼び出すと、アクセスバイオレイションで落ちてしまいます。 どうも、ダイアログの親ウインドウが無いのが問題のようです。どうすれば解決するでしょうか? Exe--------------- BOOL CXXXXApp::InitInstance() { HINSTANCE hDll = NULL; int (__stdcall *lpdlg)( ); hDll = ::LoadLibrary("test.dll"); (FARPROC&)lpdlg = ::GetProcAddress(hDll, "dlgtest"); (*lpdlg)( ); ::FreeLibrary(hDll); } DLL内--------------------- AFX_MANAGE_STATE(AfxGetStaticModuleState()); AfxSetResourceHandle(AfxGetResourceHandle()); CTestDlg dlg; dlg.DoModal();

  • mfc42.dllファイルってなんですか?

    こんにちは。 最近、プログラムの勉強をしている物ですが、例えばVBであるシステムを開発して、SetUpを作った際に、色々なプラットフォームで検証するのですが、mfc42.dllというファイルが絡んだエラーが良く出ます。 そもそも「mfc42.dll」とは何でしょうか? OSインストール時に最初から入っているものなのでしょうか? dllファイルとはダイナミックリンクライブラリの事で、OSが色んな時に使用する共通の関数が詰まっている、VBでいう標準モジュールのようなものの事ですよね?(合ってますか(^^;)?) mfc42.dllがそうなら、どういうときに使用されるのでしょうか? また、Aというソフトをインストールした後で、Bというソフトをインストールして、互いのmfc42.dllの更新日時(バージョン?)が違う場合、Bをインストールする事によってAが動かなくなる・・・というのもありえるのでしょうか?? だとしたらとても怖い事ですよね!? でもSetUp作成ソフトやVB標準のディストリビュージョンでSetUp.exeをつくると勝手にmfc42.dllが紐付かれてしまう場合が多々あります。 これを回避する方法はあるのでしょうか? どなたかご教授下さい。

  • VC++.NET DLLからのダイアログの表示

    こんばんは。 VC++.NETでDLLを作成しました。 内容はダイアログを表示させるだけの単純なもので DLLの種類はMFC拡張DLLで作成しました。 (CDIALOGを継承したクラスTESTDIALOGのコンストラクタ、デストラクタがあるだけのもの) これをテスト用の単純なMFCアプリケーションで呼び出したところ ダイアログを表示させることができましたが 別の複雑なアプリケーション(DLLからDLLを呼ぶなどしている)で 呼び出したところダイアログが表示されません。 コンパイルエラーなどもでないし 何がいけないのか分かりません。 呼び出し側ではメニューにイベントハンドラを作ってそこで TESTDIALOG dlg; dlg.DoModal(); としているだけなのですが・・・ (デバッガで追ったところMFCのdlgcore.cppのCDialog::DoModalの m_lpDialogTemplateNameが不適切なptrとなる辺りに原因はありそうなのですが何故そうなるのかわかりません。) どなたかダイアログが表示されない原因がお分かりになる方 よろしくお願いします。

  • MFC ボタンのEnableについて

    はじめまして。 質問させてください。 VC++ 2005 MFCで開発しております。 DLGにボタンを配置して ボタン押下後自身のEnableをきります。 するとタブがダイアログ自体も含め どこにも当たらずタブキーが効きません。 OnOk, OnCancelで処理させたいのですが 当然メッセージを取得できません。 ダイアログのアクティブを一度切り替えるとなおります。 解決方法としては ボタン押下でEnableをきった後 ダイアログにフォーカスを当てると正常に動きます。 This->SetForcus(); これはMFCの仕様なのでしょうか? ボタン押下後自身のEnableをきることはよく行う動きだと思いますが。 以上になります。 お詳しい方がおられましたらご教授お願い致します。

  • メインダイアログを表示させずにファイル選択ダイアログを表示

    VC++2005のMFCダイアログベースでプログラムを作成しています。 自動生成されたプログラムを何も変更しないまま実行すると、 メインのダイアログが表示されますが、 そのダイアログを表示させずに、ファイル選択ダイアログを表示させたいのです。 自分で実装しビルド実行したところ、期待動作をしましたが、 ファイル選択ダイアログを閉じた後に、画像のようなエラーが発生してしまいます。 エラーを発生させず、期待動作をさせる良い実装方法をご存知の方おられましたら、 ご教示お願い致します。 【変更実装(エラー発生)】 BOOL CtestApp::InitInstance() { … CtestDlg dlg; m_pMainWnd = &dlg; // INT_PTR nResponse = dlg.DoModal(); //コメントアウト dlg.OnBnClickedButton1(); //ファイル選択ダイアログを表示する関数 //if (nResponse == IDOK) //コメントアウト //else if (nResponse == IDCANCEL) //コメントアウト … } void CtestDlg::OnBnClickedButton1() { CFileDialog ReadDlg( TRUE, NULL, "*.txt", OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, "txtファイル(*.txt)", this ); … }

  • DLLでダイアログ

    VC++6.0にてMFCを使うDLLを作成しています。 関連HPを参考になんとかDLLを作ることが出来ました。 そこで今度はDLL側でダイアログボックスを作成して表示させようとしたところうまくいきません。 エラーも無くスルーされてしまいます。 こういう使い方は出来ないのでしょうか。 ↓DLL関数のソースファイルです。 ---------------------------------------------- #include "StdAfx.h" #include "Defs.h" #include "Func.h" #include "resource.h" #include "testdlg.h" #include "dlg2.h" int WINAPI DllFunc( CString &p_rcStr, CWnd *p_pcWnd ) { TestDlg dlg; Cdlg2 dlg2; dlg.ps = p_rcStr; dlg2.DoModal();//なにも出ない AfxMessageBox(p_rcStr);//コレはOK dlg.DoModal();//何もでない return TRUE; } --------------------------------------------

  • ダイアログベースアプリのDLL化の方法について

    ダイアログベースで作成してあるアプリexeを DLL化するのですが、その方法が分かりません。 ダイアログの使用はやめるつもりです。 これまでやってみたことは、 プロジェクトのプロパティで、EXEファイルからDLLに設定を 変更しました。 http://hp.vector.co.jp/authors/VA019517/howtodll.html サンプルを見て、既存のソースに__stdcallなどを記載したいのですが DLLが作成されませんでした。 新規にプロジェクトを作成して、サンプル通りにやった場合は DLLが作成されました。 呼び出したい関数は、別々のファイルですが、 1つのファイルにまとめる必要がありますか? ダイアログベースはやめます。 この2つの関数は、同じDLLにします。 ↓DLL化するソース。ここを外部EXEから呼び出したい。 Test_aa_App.cpp --------------------------------------- CTest_aa_App::InitInctance(){ //初期化処理 } ↓呼び出し対象DLL Test_bb_Dlg.cpp -------------------------------- CTest_bb_Dlg::Test() { // 処理 } 初歩的なことだと思いますが、まず、どのように ソースを変更すれば良いか教えてください。 VS2003 C++6.0 よろしくお願いします。

  • VBにてDLLをデバックする方法。

    環境:Win2000+VB6SP5 自作のDLLのVBPとそれを参照するEXEのVBPがあるのですが、 EXE側からDLL呼び出し、呼出し後もDLL内のソースをステップ実行するにはどうすればよいのでしょうか? よろしくお願いしますm(__)m

専門家に質問してみよう