• ベストアンサー

途中からMFCを使用したい

はじめて質問させていただきますVisual C++初心者です。 現在Visual C++ 6.0で開発作業を行っていますが大変困っています。 前任者が「MFCを使用しない」でプロジェクトを作成していたのですが、前任者の退職により本作業を引き継ぐことになりました。 ほとんどAPIのみで作成されたいましたが、MFCを使用したいと考え、プロジェクト設定から「共通DLLでMFCを使用」にしたところ、リンカエラー(LNK2001)が続出しました。(恐らくAPI使用分だけ出ているのだと思います。) このように途中からMFCを使用する場合、簡単に設定変更できるものなのでしょうか。やはり、MFC使用でプロジェクトを作り直してからコードを移植していったほうが早いのでしょうか。 諸先輩方のご意見を参考にさせてください。宜しくお願い致します。

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

  • ベストアンサー
  • furyfox
  • ベストアンサー率56% (58/103)
回答No.3

ダイアログ(CDialog)なら比較的簡単に可能かもしれません。 CDialogを継承したクラスを使います。 その後にCDialog::DoModalを呼べばダイアログは表示できると思います。 あとAfxWinInitという関数を前もって呼んでおく必要があります。 試しにMFCの使っていないコンソールWin32プログラムから CDialogを呼ぶように変更しましたがうまくいきました。(環境はVisual Studio 2005です) まずリソースエディタで ダイアログを作ります。それをIDD_DIALOG1とします。 #include "stdafx.h" #include "resource.h" class CMyDialog : public CDialog{ public: CMyDialog() : CDialog(IDD_DIALOG1) {} }; int main() { if (AfxWinInit(::GetModuleHandle(NULL),NULL,::GetCommandLine(),0 )){ CMyDialog* pDialog = new CMyDialog(); pDialog->DoModal(); } return 0; } ※#include "stdafx.h"の内容 pragma once #define WIN32_LEAN_AND_MEAN #include <stdio.h> #include <tchar.h> #include <afxwin.h> #include <afxext.h> #include <afxdtctl.h> #include <afxcmn.h>

spe1-dept
質問者

お礼

大変丁寧に説明してくださりありがとうございます。 サンプルまで記述していただいて大変わかりやすかったです。 上記方法でうまくいきそうなので、独自のコードを追加していきたいと思います。 ありがとうございました!

その他の回答 (2)

  • furyfox
  • ベストアンサー率56% (58/103)
回答No.2

「既存のプログラムでCStringなどのMFCを使用するには」 http://www.doumo.jp/postgretips/tips.jsp?tips=20

spe1-dept
質問者

お礼

ご回答ありがとうございます。 リンク先を参考にし、ビルドが通るようになりました。 CStringやCFile等が使用できるようになり、快適に作業を進められそうです。

spe1-dept
質問者

補足

追加の質問申し訳ありません。 ダイアログベースのアプリケーションなので、あわよくばダイアログクラスを追加したい(コンボボックスやリストボックスにメンバ変数を追加して扱いたい)のですが、クラスが存在しないため新規作成せよといわれました。新規作成したら新たにダイアログクラスのcppファイルも追加され、そのファイルにいろいろ記述しなければならないようです。既存のcppファイルでダイアログクラスを扱いたいのですが、どのようにすればよいのでしょうか。 初歩的な質問で申し訳ありませんが、ご存知の方がいらっしゃればご教授願います。

noname#50176
noname#50176
回答No.1

MFCはカプセル隠蔽してますから、表記同調は困難ですよ。 SDKソースとMFC擬似ソースのトランスレータでもあれば可能かも しれませんが開発環境管轄なら再構築ですよね・・・。 WM_PAINT/OnDraw,なら移植調でできますが、コンテキスト処理となると ハンドラルーチンを構築する必要ありますから・・・。 外部設計仕様から内部設計仕様は共通なんですよね? WM_?? を1つずつメソッド作成して結合させるのが無難かと 思われます。私の知る限りでは・・・。

spe1-dept
質問者

お礼

やはり再構築がよさそうですね。 横着して楽にできるのであればと思って質問させていただいたんですが、そんな都合よくいかないですよね。 ご回答ありがとうございました。

関連するQ&A

  • MFCアプリケーションについて

    MFCアプリケーションを使用してプログラミングをしようと思うのですが、プロジェクト作成欄にMFCアプリケーションがありません。 使用している環境は OS : Windows XP C++ : Microsoft Visual C++ 2005 Express Edition です。 サポートされていないのでしょうか? MFCアプリケーションを使う方法を教えてください。

  • 【GUI】MFCからC#への移行についての必要性

    今まで主にMFCを用いたコーディングをしていたのですが GUIをMFCからC#に移行する作業を検討しています。 そこでCoreとなるソースはC++にしておきたいので 「MFC ダイアログベース」 から 「C++ DLL」に移植を考えてます。 その為、今テストとしていくつかのソースコードをDLL化してみましたが MFCのAPIによるエラーが非常に多く作業量が膨らむばかりです。 ここで質問ですが、このような作業は将来的にメリットを生み出す事かどうか 個人差があるかとおもいますが皆様からのご意見頂けないでしょうか? 私の方で気づいたメリットは以下の点だけで、作業に価値があるか少しずつ疑問になってます・・・。 ・WPFなどを使える事からGUI周りのレベルが上がる ・今後、C#による需要が多くなると見込んでいるため。 作業量が多く挫折しそうです。。。

  • 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++/CLIとMFC

    よろしくお願いします。 環境はVisual C++ 2005です。 ご存知の方がいらっしゃいましたらご教授ください。 一つのプロジェクトで作成した親Formに対して、 もう一つのプロジェクトで作成した子ウィンドウをプラグインさせ、MDIを作ろうとしているのですが [CLR]->[Windowsフォームアプリケーション]で作成したプロジェクトのFormに対して MFCで作成した子ウィンドウをプラグインさせることは可能なのでしょうか? C++/CLIでMDIを作る時は MDIの親となるFormのIsMdiContainerプロパティをtrueに設定し、 MDIの子となるFormのMdiParentプロパティをMDIの親Formの インスタンスに設定する必要があると思うのですが、 子の部分をMFCを使って作成した場合どのようにすれば 親子関係が作れるのかわからず質問させていただきました。 よろしくお願いします。

  • Visual C++2005でMFC形式(?)のDLLを含んだSDKの利用について

    環境:Win2000 SP4 VS2005 pro SP1 現在大学で実験をするためのプログラムを作成しようとしています。 前任者が作った実験用プログラム(Win32API)があり、それに今年購入したハードウェアのSDKを導入することでプログラムの拡張を図っています。 (具体的には今までの測定に追加して動画解析を行おうとしてるのですが・・・) そこでそのSDKの説明書通りにインクルードフォルダを設定し、libファイルを設定しました。 それからソースに説明書通りにヘッダーをインクルードしました。 (このヘッダーファイルをインクルードすることによりSDKに含まれる3つのDLLがすべて読み込まれるらしいです) そこでとりあえずインクルードだけしてコンパイルしてみたところ SDKに含まれるヘッダーファイル中にCStringの構文エラーが出ました error C2061: 構文エラー : 識別子 'CString' 説明書によるとSDKに含まれるDLLのうち1つはwin32DLLで残り2つはMFC標準DLLというもののようです。 プロジェクトのプロパティから文字コードをマルチ、Unicodeとやってみましたがダメでした。 またMFCの利用設定もすべて試してみましたがダメでした。 今までVSをさわったことがなくC言語も少しかじったことがあるだけなので困り果てています。 回答よろしくお願いします。

  • VCで作成したDLLをBCBから呼び出す方法

    皆さん こんにちは。 VCで作成したCのAPIを実装したDLLをBCB6.0で作成したアプリケーションから呼び出そうとしています。 コンパイルは通るのですが、リンク時に以下のエラーメッセージが表示されてしまいます。   [リンカ エラー] 外部シンボル 'My Function' が未解決(C:\BCB\***.OBJ が参照) BCB6のフォームプロジェクトからDLLを利用するために、以下の手順を行いました。 (1)DLLをbcb用に変換する   implib -a aaa.lib aaa.dll (2)プロジェクトにaaa.libを追加 (3)aaa.dllをプロジェクトのフォルダに追加 (4)コードを以下のように実装しました    extern "C" __stdcall ulong SysInitialize(void);  //プロトタイプ宣言    ulong ulRetVal = SysInitialize(); //コード内での呼び出し この状態でコンパイルは通るのですがリンカでエラーが発生します      [リンカ エラー] 外部シンボル 'SysInitialize' が未解決(C:\BCB\TELIGEV\MAINDLG.OBJ が参照 他のサイトで調べたところ、C++特有の修飾子"@***"がついている場合に同じエラーが出るとのことだったので、dumpbin.exeを使ってDLL内の関数をダンプしたところ、関数名にはアンダースコアや@などは関数名についていないようです。 dumpbinの出力結果   1 1D 000065A0 SysInitialize このほか、自分なりに調べたところ、以下のサイトを見つけたのですが、英語力の弱さから解決策を見出すまでには至りませんでした。 Using Visual C++ DLLs with C++Builder http://bcbjournal.org/articles/vol4/0012/Using_Visual_C_DLLs_with_CBuilder.htm どなたか、ご助言いただけると助かります。 よろしくお願いします。

  • MFC

    扱うテーマはMFCやWin32APIです。 ↑これが扱える手ごろなアカデミック版での開発ツールって御座いますか? また、アカデミックではないようですが[Visual C++.NET]あたりが調べた所、値段的に手ごろな感じがしたのですが…。他に良いもの有りましたらご教示下さいm(_ _)m宜しくお願いします。

  • VC++6.0 MFC APPWizard(exe)で_main未解決

    VC++6.0のMFC APPWizard(exe)において、リンカーオプションの subsystem:console でDOS画面にprintfでデバッグ出力しようとしたのですが、Buildで、 msvcrtd.lib(crtexe.obj) : error LNK2001: 外部シンボル "_main" は未解決です と怒られてしまいます。 この対策または、目的を達成するためにはどうすればよいのでしょうか?どなたか教えてください。 また、Visual Studio 2005 でもVC++で同じようなことになるのでしょうか?

  • vs2010 mfc拡張DLL LNK2019

    vs2010の開発環境で、mfcアプリケーションを作成しています。 mfc拡張DLLを追加すると、LNK2019が発生し、リンクが失敗します。 ( LNK2019 : 未解決の外部シンボル / unresolved external symbol ) 同様の作業をvs2005、vs2008で行っても、このエラーは発生しません。 また、vs2005、vs2008のソリューションファイルをvs2010に変換しても、このエラーは発生しません。 プロパティを比較しましたが、解決に至っておりません。 解決方法をご存知の方、ご教示ください。 よろしくお願いいたします。

  • VisualStudio2010の設定について

    VisualStudio2010を使用しC++でプロジェクトを作成しているのですが、 インクルードディレクトリのパスや リンカーの追加のライブラリディレクトリ、追加の依存ファイル 等の設定を毎回手動で行いプロジェクトを作成しているのですが、 設定項目が多く、毎回設定するのが大変です。 インクルードやリンカーの情報を保存しておく方法等ご存知の方がいたら教えて下さい。

専門家に質問してみよう