C++ビルドエラーの対処方法と注意点

このQ&Aのポイント
  • VC++6.0コードを変更せずにVS 2008 C++(Professional Edition)でビルドするとコンパイルはパスしますが、2件のワーニングが出ます。
  • Win VistaでVS 2008 SP1の環境です。
  • CWinApp::Enable3dControlsStaticの呼び出しは不要です。新しい定義が必要か確認してください。ULONGLONGからLONGへの変換については修正方法がわかりません。
回答を見る
  • ベストアンサー

C++ビルドエラー

VC++6.0コードを変更をしないでVS 2008 C++(Professional Edtion)でビルドするとコンパイルはパスしますが、2件のワーニングがでます。 Win VistaでVS 2008 SP1のコンディションです。 アドバイスをくれませんか? 1. warning C4996: 'CWinApp::Enable3dControlsStatic': CWinApp::Enable3dControlsStatic is no longer needed. You should remove this call.   #ifdef _AFXDLL Enable3dControls();   #else Enable3dControlsStatic();   #endif c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\afxwin.h(4821) : 'CWinApp::Enable3dControlsStatic'の宣言を確認して ください。 >クラスに新しい定義が必要ですか? 2. warning C4244: '=' : 'ULONGLONG' から 'LONG' への変換です。データが失われる可能性があります。   LONG lSize = 0L; // ヘッダ部を読み込みます。 TRY { lSize = m_pCFile->Seek( 0L, CFile::end ); m_pCFile->SeekToBegin(); . . >修正がわかりません。 以上

noname#187796
noname#187796

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

  • ベストアンサー
noname#137556
noname#137556
回答No.1

1.もう要らないから,関数呼び出しを削除しましょう。と言ってます。 http://msdn.microsoft.com/ja-jp/library/s67e55k0(VS.80).aspx 2.戻り値のULONGLONG が(たぶん)64ビットで,ULONGが32ビットなので,心配してくれています。 lSize を ULONGLONG で宣言しておけばいいでしょう。 # 別の場所でワーニング出るかも。

noname#187796
質問者

お礼

助かりました。ありがとうございました。 ほかに下記エラーがあります。いくつかパラメーターをテストしましたが解決していません。 アドバイスをいただけませんか? afx.h(25); fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d] プロジェクト"構成プロパティ" -> "C/C++" -> "コード生成" -> "ランタイムライブラリ" -マルチスレッド (/MT)  -マルチスレッド DLL (/MD)

その他の回答 (1)

noname#137556
noname#137556
回答No.2

最近 MFC を触ってませんが,とりあえず検索してみたら, http://blog.goo.ne.jp/satomi_takeo/m/200902 # 別件なので質問し直したほうがいいかも

noname#187796
質問者

お礼

ありがとうございました。

関連するQ&A

  • DWORDの実際の型は何でしょうか

    VC++.NETの環境です。 DOWRD dw1 = 1; int i = 2; と定義し ここで if ( i > dw1 ){ 何かの処理; } とコーディングすると warning C4018: '>' : signed と unsigned の数値を比較しようとしました。 のワーニングがでます。 これは、DWORDがint型でなくunsigned int型のようにも見えます。 ある本によれば(VC++.V.NET逆引き大全500の極意) DWORD はint型であると記述されています。 もし、int型ならこのワーニングはでないはずなのですが、 なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

  • CxxxView::GetDocument() const; のエラー

    はじめまして 分け合って数年ぶりにVC++で開発することになりました。 CYomiDoc* CYomiView::GetDocument() const; 上記コンパイルでエラーが出るようになってしまいましたが、 解決方法がわかりません。 エラーは、 error C2143: 構文エラー : ';' が '*' の前にありません。 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません warning C4183: 'GetDocument': 戻り値の型がありません。'int' を返すメンバ関数とみなします。 よろしくお願いします。 環境 Wndows 7/vista VS2005 MFC

  • チェックボックスの使い方教えてください。

    VC++6.0 MFC です。 チェックリストボックスを無効から有効に切り替えたいんだけど 使い方が良くわかんないっす。 ダイアログエディタで先にIDC_CHECK1のチェックボックスを無効にしてます。 (あと、IDC_CHECK1はメンバ変数bool m_bFlagって入れてます。) CCheckListBox* ckBox; ckBox->Enable(IDC_CHECK1,true); warning C4700: 値が割り当てられていない ローカルな変数 'ckBox' に対して参照が行われました。

  • コンパイルエラー'CObject::operator =' : private メンバ (クラス 'CObject' で宣言されている) にアクセスできません。

    現在ダイアログA,B,Cがあります。 Aにはボタン2つ([C]呼び込みボタンと[格納]ボタン)、タブがあり、 Bにはエディットボックス(IDC_EDIT1)とスピンボタン(IDC_SPIN1)が Cにもエディットボックス(IDC_EDIT2)とスピンボタン(IDC_SPIN2)があります。 BもCもスピンボタンを押すたびに数値が増減します。 それで、 Aは呼び出し元 BはAにあるタブ内に表示されるダイアログ CはAのボタン押下で呼び出されるダイアログ です。 Aのヘッダに CBDlg m_bdlg; CCDlg m_cdlg; struct aaa { int b; // Bダイアログのスピンの数値を格納する   int c; // Cダイアログの〃 }; と定義しました。 Aの[格納]ボタンを押すと構造体に格納されるようにしたいので void CADlg::OnBnClickedKakuno() { struct aaa astruct; astruct.b = m_bdlg.GetDlgItemInt(IDC_EDIT1); astruct.c = m_cdlg.GetDlgItemInt(IDC_EDIT2); } このようにしてコンパイルをしたところ ------------------------------------------------- 1>c:\program files\microsoft visual studio 8\vc\atlmfc\include\afxwin.h(1820) : error C2248: 'CObject::operator =' : private メンバ (クラス 'CObject' で宣言されている) にアクセスできません。 1> c:\program files\microsoft visual studio 8\vc\atlmfc\include\afx.h(559) : 'CObject::operator =' の宣言を確認してください。 1> c:\program files\microsoft visual studio 8\vc\atlmfc\include\afx.h(529) : 'CObject' の宣言を確認してください。 1> コンパイラでのこの診断により関数 'CCmdTarget &CCmdTarget::operator =(const CCmdTarget &)' が生成されました。 ------------------------------------------------- のようなエラーが発生しました。 どうすればよいのでしょうか? 解決法の程、ご教授いただければと思います。

  • PROCのコンパイルエラーの取り方がわかりません

    ソース自体が長いので問題となっている所だけ書きます。 情報量が少なくて申し訳ありませんが…。 VC環境です。 /* define定義 */ #define IF_ITEM_CNT 14   ・   ・   ・ /* 内部関数プロトタイプ宣言 */ int AnalyzeProc( char **pReturnString, char *pTargetString, int StrNum, char String );          /* 文字列分解処理を行う関数 */   ・   ・   ・ /* グローバル変数宣言 */ char In_Rec[ IN_FILE_MAX_LEN + 1 ]; char *w_In_Rec[ IN_ITEM_CNT + 1 ];   ・   ・    int Main{ ・   ・   ・ } int MainProc{   ・   ・ strncpy( g_dn03_rec.DN03_KISYU_MEI, sizeof( g_dn03_rec.DN03_KISYU_MEI ), w_In_Rec[ 10 ], DN03_KISYU_MEI );   ・   ・   M_Res = AnalyzeProc( &w_IN_Rec, In_Rec, IF_ITEM_CNT, ',' );   ・ addSpeace( 0, 0, DN03_KISYU_MEI_LEN, _dn03_rec.DN03_KISYU_MEI );   ・   ・ return ( TRUE ); } となっているのですが、エラーが出ます。 Warning C4047 : '関数' : 内接参照のレベルが 'char **' と 'char *(*)[15]' で異ります。 Warning C4024 : 'AnalyzeProc' この型が 1 の仮引数および実引数と異なります。 Warning C4013 : 関数 'addSpace' は定義されていません。int型の値を返す外部関数と見なします。 あとリンクのエラーで error : LNK2019 : 未解決の外部シンボル _addSpeace が関数 _MainProc で参照されました。 fatal error LNK1120: 外部参照 1 が未解決です。 というエラーが出るのですがどう直していいかわかりません。 Warning C4047も型が違うのはわかるんですがどうすればいいのか…。 Warning C4013は前にこのエラーが出たときはプロトタイプ宣言することでエラーは無くなったんですが、 今回のは違うみたいです。宣言の仕方が悪かったのかもしれませんが。

  • VisualC++2005 「C2039 SetWindowTextAがCButton のメンバでは無い」と出てしまう。

    VisualC++2005において、プロジェクト(ソリューション)を以下のように構成した場合に表記のエラーが出ます。 解決方法ご存知でしたら教えて下さい。 (MFC初心者です) 【構成】 ・新規のソリューションにMFCのMDI形式のプロジェクトを作成 ・さらにMFC拡張DLLのプロジェクトを作成する (1つのソリューションに2つのプロジェクトを同居させる) ・MDIのプロジェクトは特に何もしない ・MFC拡張DLL側でダイアログを1ヶ作成する ・作成したダイアログのクラスを作成 ・OnInitDialog()を作成 ・作成したダイアログにあるボタンにメンバ変数(例:m_Button)を割り当てる ・OnInitDialog()内でm_Button.SetWindowText("HOGE");と記述 ・コンパイルするとエラーが出る 【エラー】 error C2039: 'SetWindowTextA' : 'CButton' のメンバではありません。 1> c:\program files\microsoft visual studio 8\vc\atlmfc\include\afxwin.h(2990) : 'CButton' の宣言を確認してください。 特に変わったことをしているわけではありません。 さらに「m_Button.」と入力した時点で入力補助機能が働くので m_Buttonはちゃんと認識されていると思います。 'CButton' 固有のメンバ関数の使用には問題ありませんが、 継承されているメンバ関数はことごとくNGです。

  • CComBSTR型文字列の

    こんにちは 目黒@C++学習中です CComBSTR型の文字列の編集方法について教えて下さい。 既に代入済みのCComBSTR型の文字列を短くする方法がわかりません 以下はテストソースです。 sName = sName.m_str;の行を入れれば取あえず可能ですが BoundsCheckerでエラーになります。 m_strをfreeしている為。 #スペースがトリムされてしまう、 #トリムを防ぐ方法があったら教えて下さい #define UNICODE #define _UNICODE #include <windows.h> #include <atlbase.h> int main(void) { CComBSTR sName; sName = L"012345789\\abc"; long lSize = sName.Length(); WCHAR* sP = ::StrRChr(sName,NULL,L'\\'); if (sP != NULL) { *sP = 0; lSize = sName.Length(); // sName = sName.m_str; } sName += L"efg"; return EXIT_SUCCESS; }

  • VC++ MFC エラーコード C2248 private メンバ (クラス 'CObject'で…

    VC++ MFC エラーコード C2248 現在、ダイアログAにあるコンボボックス(IDC_COMBO1)に単語を登録、削除する処理をしています。 ダイアログAには他に[登録]ボタン(IDC_BUTTON1)と[削除]ボタン(IDC_BUTTON2)があります。 IDC_COMBO1 を CComboBox m_combo; として // [登録]ボタン押下時 void CADlg::OnBnClickedButton1() { CString Txt, old; int ret = 0, count = 0, i; m_combo.GetWindowText(Txt); if ( strcmp(Txt, "") == 0 ) { AfxMessageBox( _T("語句を入力してください")); return; } // コンボボックスのリスト数取得 count = m_combo.GetCount(); for(i = 0; i < count; i++){ // IDC_COMBO1に登録済みの語句を順番に調べていく m_combo.GetLBText(i, old); // 既に登録済みの名前があった場合 if (oldFile == Txt){ ret = MessageBox( _T("上書きしますか?"), _T("語句登録"), MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2 ); } } if ( ret == IDYES ) { return; } else if ( ret == IDNO ) { // 後ほど説明します CBDlg dlg; dlg.DoModal(); m_combo1.AddString(NewName); // extern CString NewName;←グローバル変数(Bダイアログから) return; } // 登録されていない語句の場合 m_combo.AddString(Txt); } 上記の登録の方、エラーなくコンパイルがとおり、コンボボックスにもちゃんと格納されています。 削除の方もエラーなくちゃんとコンボボックスから削除されます。 次に >else if ( ret == IDNO ) の部分なのですが [いいえ]ボタン(IDNO)が押された場合にはダイアログBが表示されます。 ダイアログBには語句を入力するエディットボックスIDC_EDIT1、[登録]ボタン(IDC_TOUROKU)、[取り消し]ボタン(IDC_TORIKESI)があります。 IDC_EDIT1 を CEdit m_ed1; として ここのBダイアログでもAダイアログ中のコンボボックスに格納されている語句が入力された場合はメッセージボックスを表示したいのです。 そこで void CBDlg::OnBnClickedTouroku() { // TODO: ここにコントロール通知ハンドラ コードを追加します。 int rup, cnt, ret; CString oldf; CADlg cad; CComboBox cfdn = cad.m_combo; m_ed1.GetWindowText(NewName); // CString NewName;←グローバル変数 // Aダイアログ中のコンボボックスリスト数の取得 cnt = cfdn.GetCount(); for(rup = 0; rup < cnt; rup++){ // Aダイアログのコンボボックス中に登録されている語句取得 cfdn.GetLBText(rup, oldf); if (oldf == NewName){ ret = MessageBox( _T("本当に上書きしてもいいですか?"), _T("環境設定"), MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2 ); } } if(ret == IDOK){ OnOK(); } else{ return; } } としました。 ここでコンパイルすると 1>c:\program files\microsoft visual studio 8\vc\atlmfc\include\afxwin.h(1820) : error C2248: 'CObject::CObject' : private メンバ (クラス 'CObject' で宣言されている) にアクセスできません。 1> c:\program files\microsoft visual studio 8\vc\atlmfc\include\afx.h(558) : 'CObject::CObject' の宣言を確認してください。 1> c:\program files\microsoft visual studio 8\vc\atlmfc\include\afx.h(529) : 'CObject' の宣言を確認してください。 1> コンパイラでのこの診断により関数 'CCmdTarget::CCmdTarget(const CCmdTarget &)' が生成されました。 のようにエラーがでます。 調べてみると CComboBox cfdn = cad.m_combo; が原因のようです。 ググってみたりしたのですが解消法がわからず質問させていただきました。 よろしくお願いします。

  • Detected memory leaks!

    VS2010を使用しています。 複数人で同じプロジェクトを編集しています。 いつからか「Detected memory leaks!」が多発するようになり、Dumping Objectsの結果からいくつかは修正できたのですが、 ---------------------------------------- f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {34985} normal block at 0x05ECE620, 104 bytes long. Data: < }R+ + > 84 CF 7D 52 2B 00 00 00 2B 00 00 00 01 00 00 00 ---------------------------------------- 上記の内容だけは意味がわかりません。 他の回答に「_CrtDumpMemoryLeaks」の実行場所をできるだけ後にするというようなことで対策できたようですが、このプロジェクトでは、記述していません。(明示的には実行していない) 何か、何かアドバイスをいただけたら助かります。 よろしくお願いいたします。

  • 自作DLLの引数について、ポインタ渡しが??

    VS2005 VC++環境でMFCスマートデバイスDLLを作成しています(アプリ側もVS2005 VC++)。 テスト用のアプリからDLL内の文字列を引数とする関数を呼び出すと、 呼ばれた関数に正しく文字列が渡りません。 以下の場合、func1のw1はデバッガで正しく見れません。 でもw2にtcscpyは成功しw2には正しく値がセットされます。 このときにw1のアドレスがなぜか変更されます。 以下の例では引数が1つですが、2つ以上引数がある時には その他の引数のアドレスもとびます。 func2のl1は正常に見れます。 func3のl1は正常に見れません。 ポインタ渡しするときに異常になるのですが、 原因がさっぱりわかりません。 同じことをWindowsXP用のプロジェクトを作り、 XPで確認するとどれも正常に見れます。 どなたかアドバイスをお願いします。 ----------------------------------------DLL側---------------------------------------- extern "C" __declspec(dllexport) void func1(WCHAR * w1) { WCHAR w2[16] ; _tcscpy(w2,w1); return; } extern "C" __declspec(dllexport) void func2(long l1) { long l2 ; l2 = l1 ; return; } extern "C" __declspec(dllexport) void func3(long *l1) { long l2 ; l2 = *l1 ; return; } ----------------------------------------アプリ側---------------------------------------- extern "C" __declspec(dllimport) void func1(WCHAR *); extern "C" __declspec(dllimport) void func2(long ); extern "C" __declspec(dllimport) void func3(long *); ・・・・中略・・・・ WCHAR a[16] ; _tcscpy(a,_T("ABC")); func1(a); func2(123); long l3 = 123 ; func3(&l3);

専門家に質問してみよう