• ベストアンサー

MFCをDLL化してコンソールアプリから起動

MFCアプリケーション(プロジェクト作成でMFCアプリケーションを選択)をDLL化して、コンソールアプリケーションからこのMFCをマルチスレッドで起動する方法を教えてください。MFCが起動後、コンソールアプリケーションの処理は次に進行し、MFCは操作可能な状態(アイコンなどがクリック可能で、青丸クルクルにはならない)にしたいです。また、コンソールアプリケーションからもMFCが操作可能にしたいです(例えば、コンソールアプリからAと入力するとファイルのオープンダイアログが開く、、、とか)。

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

  • ベストアンサー
  • unokwave
  • ベストアンサー率58% (966/1654)
回答No.1

そのような質問をする知識量が前提ではとてもここで説明できるような規模ではありません。 概要を書くと、 WindowsのアプリはWinMain関数で始まり、DLLはDllMain関数で始まりますが、MFCはそれらをラップしたインターフェースを提供していて、初期化や前提条件で差があります。 まずこの部分をDLL用に書き換える必要があります。 その際にマルチスレッド対応でプロジェクトを設定してください。 次にDLL化したアプリに外部公開インターフェースを追加します。 追加するインターフェースの一つはダイアログへメッセージを送る事ができるように、ダイアログのクラスにCallbackメソッドを用意します。 そのCallbackメソッドは自分のインスタンスに向けてメッセージを投げるように作ります。 追加したインターフェースの一つから、そのCallbackを呼ぶよう実装してください。 最後に、コンソールアプリのプロジェクトをマルチスレッド対応で構成して、main関数からスレッドを起こします。 そのスレッドでDLLを読み込み、DLLのインターフェースを呼び出してください。

takedon3
質問者

お礼

ご回答いただきありがとうございます。確かに、一つの質問に、多くを書きすぎました。もう少しバラして質問します。でも、概要は、わかりました。

関連するQ&A

  • MFCでコンソール出力

    コンソールアプリケーションをMFCアプリケーションへ置き換える作業を行っていて、一つ疑問に感じることがあるのですが、コンソールアプリケーションのprint文が出力されなくなってしまいました。(Dosコンソールから起動して) そこで質問なのですが、MFCアプリケーションをDosコンソールから起動してコンソールメッセージを出力することはできるのでしょうか?

  • ダイアログベースアプリの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 よろしくお願いします。

  • MFCのインクルードファイルについて

    VC++のMFCについて教えていただきたいのですが。 VC++のプロジェクトには、MFCとかコンソールアプリとかあると思うんですが、普通のWinアプリやコンソールアプリにはなく、MFCで標準的にインクルードされるファイルってどんなものがあるのでしょうか。 今、コンソールアプリでコンパイルしたらエラーとなり、MFCでするとエラーなくコンパイルできます。 よろしくお願いします。

  • ファイルドラックでアプリを起動したら・・・(MFC)

    いつもお世話になっております Win98SE VC++6.0 MFC SDI formview ベースのアプリケーションを作っているのですが、 アプリケーションのアイコンに開くファイルをドラックしたら以下のエラーのダイアログがでて、コマンドライン引数が受けられないばかりかアプリケーションが止まってしまいます。 ------------------------------------------ Microsoft Visual C++ Runtime Library Runtime Error! Program : "実行ファイルの名前" abnormal program termination ------------------------------------- どこをいじってそうなってしまったのかわからないので困っています。 心当たりのあるかたアドバイスお願いいたします。 普通に起動して、開くコマンドでファイルを開くのは大丈夫です。

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

  • gdiplus.dllを使わないプログラム開発

    はじめまして、 ”Microsoft Visual C++ 2008”にてダイアログベースのプログラムを書いています。 windows2000に対応するために、gdiplus.dllを使用しないプログラムを作成したいのですが、 新規作成したプロジェクトをそのままビルドしただけでもgdiplus.dllが読込まれてしまいます。 読込まなくするには、どのように設定を行なえばよいのでしょうか。 それとも”Visual C++ 2008”ではgdiplus.dllを使用しないダイアログベースのプログラム開発は不可能なのでしょうか。 動作対象OS:win2000(SPなし)以降 開発環境: 言語:Visual C++ 2008(visual studio 2008 professional edition) テンプレート:MFCアプリケーション アプリケーションの種類:ダイアログベース 以上、よろしくお願いいたします。

  • C#のコンソールアプリ

    起動時に引数としてファイルの絶対パスを与え、そのファイルの内容を表示させる、というコンソールアプリを作成しようとしています。 このとき、引数にはエスケープ文字が入ることが予想されますが、そのまま処理に使用できるのでしょうか?

  • 別のDLLのダイアログを・・・

    VC++.NETでMFCアプリを開発しています。 コマンド側から、別のDLLのダイアログをCreateし、ShowWindow()したところで例外が発生します。 コマンド側は通常のDLLで作成し、「staticライブラリでMFCを使用する」で使用し、 ダイアログ側は拡張DLLで作成し、「共有DLLでMFCを使用する」で使用しております。 Create()するところで、コマンドのポインタをダイアログに渡すと例外が発生します。 理由がわかりません。教えてくださいm(__)m 説明が足りなければ補足いたします。

  • コンソールアプリの起動パラメータ について

    ・環境   XP, Borland C++ Compiler 5.5 ・使用言語   C++ コンソールアプリを作成しています。 コンパイルして出来上がったEXEのアイコンに、何かファイルを ドラッグ&ドロップすると、そのファイルがパラメータとなって EXEが起動されると思うのですが、ここで疑問があります。 (1)最大パラメータ数というのはどこかに規定されているのでしょうか。 (2)複数のファイルをドラッグ&ドロップした時に、EXEに渡される順番というのはどのように決定されるのでしょうか。 よろしくお願い致します。

  • 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となる辺りに原因はありそうなのですが何故そうなるのかわかりません。) どなたかダイアログが表示されない原因がお分かりになる方 よろしくお願いします。

専門家に質問してみよう