電子書籍の厳選無料作品が豊富!

4月から社会人となる、情報系学生です。

勤務先で必要となるため、Visual Studio + MFCでのWindowsアプリ作成を勉強しています。

環境はVS 2008 Professional Edition(90日限定評価版)でVC++2008、参考書は「ゼロから学ぶVisual C++」です。

最初のサンプルでは、
・シングル ドキュメント インターフェイスで、
で、メニューをクリックすると「Hello」というメッセージボックスが出るプログラムを組むのですが、いきなりエラーが6つも出てしまいます。
気になる点としては、参考書ではVisual C++2003を使用して説明されているのですが、こちらの環境が2008であることぐらいで、その他の原因は皆目検討つきません。

原因がわかりそうな方がいらっしゃいましたら、何卒ご教授願います。
エラーメッセージは下記の通りです。(Worning含む)

c:\program files\microsoft visual studio 9.0\vc\include\cstringt.h(267) : warning C4996: 'wcscpy': This function or variable may be unsafe. Consider using wcscpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
(途中省略)
c:\program files\microsoft visual studio 9.0\vc\include\atlcomcli.h(300) : error C2299: 'ATL::CComPtr<T>::operator =' : 動作の変更: 明示的な特殊化には、コピー コンストラクタまたはコピー代入演算子を使用することはできません
c:\program files\microsoft visual studio 9.0\vc\include\atlcomcli.h(304) : コンパイルされたクラスの テンプレート のインスタンス化 'ATL::CComPtr<T>' の参照を確認してください
c:\program files\microsoft visual studio 9.0\vc\include\atlcomcli.h(300) : error C2299: 'ATL::CComPtr<T>::operator =' : 動作の変更: 明示的な特殊化には、コピー コンストラクタまたはコピー代入演算子を使用することはできません
with
[
T=IUnknown
]
c:\program files\microsoft visual studio 9.0\vc\include\atlcomcli.h(508) : コンパイルされたクラスの テンプレート のインスタンス化 'ATL::CComPtr<T>' の参照を確認してください
with
[
T=IUnknown
]
c:\program files\microsoft visual studio 9.0\vc\include\atlcomcli.h(300) : error C2299: 'ATL::CComPtr<T>::operator =' : 動作の変更: 明示的な特殊化には、コピー コンストラクタまたはコピー代入演算子を使用することはできません
with
[
T=IPersistStream
]
c:\program files\microsoft visual studio 9.0\vc\include\atlcomcli.h(2215) : コンパイルされたクラスの テンプレート のインスタンス化 'ATL::CComPtr<T>' の参照を確認してください
with
[
T=IPersistStream
]
c:\program files\microsoft visual studio 9.0\vc\include\atlcomtime.h(118) : error C2535: 'ATL::COleDateTime::COleDateTime(time_t) throw()' : メンバ関数は、既に定義または宣言されています。
c:\program files\microsoft visual studio 9.0\vc\include\atlcomtime.h(114) : 'ATL::COleDateTime::COleDateTime' の宣言を確認してください。
c:\program files\microsoft visual studio 9.0\vc\include\atlcomtime.h(176) : error C2535: 'ATL::COleDateTime &ATL::COleDateTime::operator =(const time_t &) throw()' : メンバ関数は、既に定義または宣言されています。
c:\program files\microsoft visual studio 9.0\vc\include\atlcomtime.h(172) : 'ATL::COleDateTime::operator =' の宣言を確認してください。
c:\program files\microsoft visual studio 9.0\vc\include\atlcomcli.h(300) : error C2299: 'ATL::CComPtr<T>::operator =' : 動作の変更: 明示的な特殊化には、コピー コンストラクタまたはコピー代入演算子を使用することはできません
with
[
T=IMalloc
]
c:\program files\microsoft visual studio 9.0\vc\include\atlcommem.h(55) : コンパイルされたクラスの テンプレート のインスタンス化 'ATL::CComPtr<T>' の参照を確認してください
with
[
T=IMalloc
]
ビルドログは "file://c:\Users\hisazun\Documents\Visual Studio 2008\Projects\MFCsample01\MFCsample01\Debug\BuildLog.htm" に保存されました。
MFCsample01 - エラー 6、警告 7

A 回答 (9件)

ハードディスクに余裕があるなら デーモンツールでマウントしたISOファイルの内容をすべてコピーしてからインストールしてみてはいかがでしょう



stdafx.hの冒頭に

#ifdef UNICODE
#error
#endif

と記述して見るとどうなりますか
C1189のコンパイルエラーになるのであれば 文字セットの設定が疑われます

また冒頭で
#ifdef UNICODE
#undef UNICODE
#undef _UNICODE
#define MBCS
#define _MBCS
#endif
と記述した場合はどうでしょう
リンカーエラーLNK2019が報告されるだけでしょうか?

この回答への補足

ハードディスクにISOファイルの内容をコピーし、
インストールし直してみましたが、前回と同じでした。

また、stdafx.hの冒頭にご指示頂いた内容を記述してみましたが、
最初の#ifdef ~ #endif までの場合に、C1189は出ませんでした。
次の場合にも、LNK2019は出ませんでした。
いずれの場合にも、質問欄に書かせて頂いたエラー6個にWarning7個が出るのみでした。

補足日時:2008/12/23 22:05
    • good
    • 0
この回答へのお礼

返信が遅くなり、申し訳ありません。

現在、ご指示頂いた内容を実践してみようと、
再度アンインストールをかけております。
ハードディスクには多少の余裕はありますので、ISOから全てコピーし、Setupを実行してみます。

有難うございました。
結果は補足欄でご報告させて頂きます。宜しくお願い致します。

お礼日時:2008/12/23 21:02

駄目でしたか!うまくいくと思っていましたが、残念です。


ちなみにエラーは前回と全く同じ内容ですか?
確かにデーモンツールの不具合も否めませんね。最新版を利用して頂くようにお願いします。ちなみに私はDaemonToolsLiteでVS2008Proを正常インストールし、現在に至ります。

私が一番気になるのは、ウィルス駆除用のソフトか、スパイウェア除去ソフトが横取りして、インストールに失敗しているのかと疑っています。
何かソフトをインストールされていますでしょうか。

それと、OSはXPですか、VISTAですか。念のため教えて下さい。
    • good
    • 0
この回答へのお礼

御返信有難うございます。

エラーは前回と同じ内容で、数も同じでした。
デーモンツールは先のMicrosoftのリンク先から、最新版をダウンロードして利用致しました。

ウィルス、スパイウェア対策ソフトはNorton Internet Security以外は入れていませんが、遅いのが嫌いで、作業時は基本的にオフにしております。

OSはVista Homeです。

お礼日時:2008/12/23 09:36

ISOイメージをマウントでなくて DVD-Rなどに焼いてインストールしたほうがいいように思います



まさかとは思いますが デーモンツールが DVDなどの大容量のイメージへの対応不具合がある可能性も否定できません
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

当方のPC(Thinkpad R61e)には、DVD-ROMドライブしか付いていない為、Daemon Toolでのマウントを選択いたしました。
(下記サイトでもMicrosoft側で動作確認済みとなっていましたし・・・)
http://technet.microsoft.com/ja-jp/subscriptions …

本日、インストールし直してみて、なおかつ下記のサンプルアプリケーションをビルドしてみましたが、やはりエラーでした。
http://msdn.microsoft.com/ja-jp/library/482ck6x8 …

余談になりますが、学校の古いPCにはVisual C++6.0がインストールされています。こちらのシンプルな機能が羨ましく思いました(笑)

お礼日時:2008/12/22 18:59

VC++2008ExpressEditionにはMFCは含まれていないので、あまり関係ないと思いますが、やはり一度入れなおした方が良さそうですね。


入れなおしても駄目であれば、また教えてください。
また、うまくいった場合もお手数ですが「うまくいった!!」と教えて下さいね!hisazunさんが勉強を進められるようになった!と私も嬉しいので笑

インストール作業はかなり時間がかかる(特にVSの場合は)ので、面倒くさいですが、成功するまでお付き合いさせて下さい。
それでは。

この回答への補足

有難うございます。
現在関係しそうなものを軒並みアンインストールしております。
この作業が完了後に再度インストールしてみますので、結果がどちらであれ、ご報告させていただきます。

補足日時:2008/12/21 23:40
    • good
    • 0
この回答へのお礼

本日、インストールし直してみてやはりダメでしたので、Team Suiteの評価版も入れてみましたが、やはり同じ結果でした。

Microsoft提供の下記サンプルでもエラーとなりましたので、やはり環境(ハードディスク等も含め)のせいだと思われます。
http://msdn.microsoft.com/ja-jp/library/482ck6x8 …

もう少し色々やってみて、再度、補足欄等でご報告させて頂きます。

お礼日時:2008/12/22 19:02

hisazunさん、とても勉強熱心で素晴らしいと思います。

Try&Errorの繰り返しで大変お疲れかもしれませんが、あと一息頑張って下さい。
ご質問の内容とredfox63さんとのやりとりを一通り確認させて頂きました。早速ですが、私から出来る限りアドバイスさせて頂きたいと思います。

まず、hisazunさんが作成されたプロジェクトの手順に従って、私の方でも同じ手順でプロジェクトを作成してみました。(私はVS2008Pro版を使っています)
試用版ではありませんが、恐らく製品版と同じだと思うので、この辺りは問題ないと思います。
私の方ではプロジェクトを作成した後、ビルドを実行し、MFCsample01.exeを起動することが出来ました。hisazunさんの内容だと、ここで既にコンパイルエラーがたくさん出ているのですね。
続けて、Helloのメッセージが出るようにコードを追加し、実行してみると、メニューからHelloを選ぶと、"Hello"とメッセージが表示されました。

以上を踏まえて、これは私の推測ですが、hisazunさんが開発環境の構築に失敗されているのだと思いました。

確認させて頂きたいのですが、VS2008Pro試用版はどのようにインストールされたでしょうか。
(1)下記ページからISOイメージをダウンロードした後、空のDVDにISOイメージを書き込みましたか。それとも、DVDイメージを別のソフトでマウントし、それを実行されたでしょうか。
http://www.microsoft.com/downloads/details.aspx? …
(2)もしDVDメディアに書き込まれた場合、そのDVDは劣化などはしていないでしょうか。古いDVDメディアではありませんか。
(3)インストール途中にエラーになったり、何か怪しげな確認メッセージを強行突破されませんでしたか。
(4)インストール途中に別のインストーラーなどを実行されたりしていませんでしたか。
(5)最近ハードディスクの調子がおかしいことはありませんでしたか。

大変ご面倒だと思うのですが、今一度アンインストールして上記確認事項も踏まえた上で、再インストールされる方が良いと思います。
参考までに、当方VC++開発暦8年目です。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

インストールはISOイメージをダウンロード後、DAEMON Tool Liteにてマウントして行いました。
インストール中は他の操作は行いませんでしたが、私も環境構築の失敗の様な気がします。
ハードディスクは特に問題無いと思います。

VS2008Proのインストール前にVC++2008ExpressEditionを使用していたので、そちらのインクルードを読みに行ってるのでは?なども疑ってみました。
今一度、全てをアンインストールし、VS2008Proをインストールし直してみようと思います。

お礼日時:2008/12/21 23:07

MFCのスケルトンだけならOKなのでしょうか?


UnicodeモードでOKなのか確認しましょう
マルチバイトに変更してどうか

文字列を _T("ここに文字列"); といった具合の _Tマクロでくくってみてどうか
など原因となりそうなものをつぶしていって見ましょう
    • good
    • 0
この回答へのお礼

お礼が遅くなり申し訳ありません。

エラーが6個のときに、一つ一つ原因を潰していくことも
考えましたが、現在は165個出ている為、その案は諦めようと考えています・・・。
satoru_maeさんにアドバイス頂いた通り、一度インストールし直して見ようと思います。

ご回答有難うございました。

お礼日時:2008/12/21 22:58

MFCでない場合はエラーや警告の類は出ないのでしょうか?


Win32SDKのコンソールアプリとかですが ・・・
単純な Hello.cとかで試してみましょう
    • good
    • 0
この回答へのお礼

redfox63様

何度もご回答下さり、誠に有難うございます。

新規作成→プロジェクト→Win32コンソールアプリケーション
による、"Hello World!\n"プログラムは、DOS窓で開きました。

新規作成→プロジェクト→Win32プロジェクト→デバッグ
による、空ウィンドウの表示は成功致しました。

その他、「猫でもわかるWindowsプログラミング」という本も参考書として
使用しているのですが、そちらのサンプルプロジェクトもデバッグ可能でした。(WindowsAPIによるプログラムでした。)

お礼日時:2008/12/21 14:34

マルチバイト文字セットを使うの設定が正しくされなかったのではないでしょうか?



プロジェクト > プロパティ > 構成プロパティ > 全般で
『文字セット』が『マルチバイト文字セットを使用する』になっているか確認してみましょう
    • good
    • 0
この回答へのお礼

ご回答有難うございます。
確認してみましたが、ご指摘の点は大丈夫でした。

いてもたってもいられず、昨日の夜中にSP1をインストールしてみました。
インストール後、再び新規プロジェクトを生成し、いきなりビルドをかけて
みましたが、エラー165個で警告11個でした。
もうどうしていいやらわかりません。

プロジェクトの概要は
・シングルドキュメントインターフェース
・データベース、複合ドキュメントのサポートなし
です。

生成されたソースファイルは、
ChildView.cpp、MainFrm.cpp、stdafx.cpp、(プロジェクト名).cppです。
自動生成された(プロジェクト名).cppの内容は補足にコピーさせて頂きます。
何卒宜しくお願い致します。

お礼日時:2008/12/21 12:32

警告に関しては バッファオーバーランなどに対するもののように思います



'wcscpy'つまりUnicode版のstrcpyですが これをstrcpy_sなどの_s付の関数に置換した方が安全ですよといったものでしょう

引数なども変更されていますので変更の際には確認しましょう

エラーのほうはこの文面からでは分りかねます
たぶん『Hello』を表示させるために使ったオブジェクトを間違えたのだろうと思います

実際に書いたコード部分を提示なさったほうが的確な回答が得られるだろうと思います

この回答への補足

自動生成された(プロジェクト名 = MFCsample01).cppの内容です。
宜しくお願いします。

----------------------以下、ファイル内容-------------------------
// MFCsample01.cpp : アプリケーションのクラス動作を定義します。
//

#include "stdafx.h"
#include "afxwinappex.h"
#include "MFCsample01.h"
#include "MainFrm.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CMFCsample01App

BEGIN_MESSAGE_MAP(CMFCsample01App, CWinAppEx)
ON_COMMAND(ID_APP_ABOUT, &CMFCsample01App::OnAppAbout)
END_MESSAGE_MAP()


// CMFCsample01App コンストラクション

CMFCsample01App::CMFCsample01App()
{

m_bHiColorIcons = TRUE;

// TODO: この位置に構築用コードを追加してください。
// ここに InitInstance 中の重要な初期化処理をすべて記述してください。
}

// 唯一の CMFCsample01App オブジェクトです。

CMFCsample01App theApp;


// CMFCsample01App 初期化

BOOL CMFCsample01App::InitInstance()
{
CWinAppEx::InitInstance();

// 標準初期化
// これらの機能を使わずに最終的な実行可能ファイルの
// サイズを縮小したい場合は、以下から不要な初期化
// ルーチンを削除してください。
// 設定が格納されているレジストリ キーを変更します。
// TODO: 会社名または組織名などの適切な文字列に
// この文字列を変更してください。
SetRegistryKey(_T("アプリケーション ウィザードで生成されたローカル アプリケーション"));

InitContextMenuManager();

InitKeyboardManager();

InitTooltipManager();
CMFCToolTipInfo ttParams;
ttParams.m_bVislManagerTheme = TRUE;
theApp.GetTooltipManager()->SetTooltipParams(AFX_TOOLTIP_TYPE_ALL,
RUNTIME_CLASS(CMFCToolTipCtrl), &ttParams);

// メイン ウィンドウを作成するとき、このコードは新しいフレーム ウィンドウ オブジェクトを作成し、
// それをアプリケーションのメイン ウィンドウにセットします
CMainFrame* pFrame = new CMainFrame;
if (!pFrame)
return FALSE;
m_pMainWnd = pFrame;
// フレームをリソースからロードして作成します
pFrame->LoadFrame(IDR_MAINFRAME,
WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL,
NULL);






// メイン ウィンドウが初期化されたので、表示と更新を行います。
pFrame->ShowWindow(SW_SHOW);
pFrame->UpdateWindow();
// 接尾辞が存在する場合にのみ DragAcceptFiles を呼び出してください。
// SDI アプリケーションでは、ProcessShellCommand の直後にこの呼び出しが発生しなければなりません。
return TRUE;
}


// CMFCsample01App メッセージ ハンドラ




// アプリケーションのバージョン情報に使われる CAboutDlg ダイアログ

class CAboutDlg : public CDialog
{
public:
CAboutDlg();

// ダイアログ データ
enum { IDD = IDD_ABOUTBOX };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV サポート

// 実装
protected:
DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()

// ダイアログを実行するためのアプリケーション コマンド
void CMFCsample01App::OnAppAbout()
{
CAboutDlg aboutDlg;
aboutDlg.DoModal();
}

// CMFCsample01App のカスタマイズされた読み込みメソッドと保存メソッド

void CMFCsample01App::PreLoadState()
{
BOOL bNameValid;
CString strName;
bNameValid = strName.LoadString(IDS_EDIT_MENU);
ASSERT(bNameValid);
GetContextMenuManager()->AddMenu(strName, IDR_POPUP_EDIT);
}

void CMFCsample01App::LoadCustomState()
{
}

void CMFCsample01App::SaveCustomState()
{
}

// CMFCsample01App メッセージ ハンドラ
---------------------------ここまで--------------------------------

補足日時:2008/12/21 12:34
    • good
    • 0
この回答へのお礼

早速のご回答、誠に有難うございます。

実際に書いたコードですが、実はほとんどコーディングはしておらず、
1.プロジェクトの新規作成で、"MFCアプリケーション"を選択
2.ウィザードで"シングルドキュメント"を選び、"UNICODE ライブラリを使用する"チェックを外して[完了]ボタンを押下
3.リソースエディタで[テスト(&T)]メニューを追加し、サブメニューに[&Hello]を入力後、IDを[ID_TEST_HELLO]に設定
4.[イベントハンドラの追加]から、[CMFCsample01View]クラスを選択し、[追加して編集]ボタンをクリック
5.void CMFCsample01View::OnTestHello(){}内に以下のコードを記述
AfxMessageBox( "Hello" );

以上です。

どうか宜しくお願い致します。

お礼日時:2008/12/20 21:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!