none
windowsアプリケーションを始めたのですが RRS feed

  • 質問

  • Vc++2010 を使っています

    windowsフォームアプリケーションで

    #include <windows.h>


    LPESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    ATOM InitApp(HINSTANCE);
    BOOL InitInstance(HINSTANCE, int);

    char szClassName[] = "template";  //ウィンドウクラス


    int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
                    LPSTR 1psCmdLine, int nCmdShow)
    {
     MSG msg;
     BOOL bRet;

     if (!InitApp(hCurInst))
      return FALSE;
     if (!InitInstance(hCurInst, nCmdShow))
      return FALSE;
     while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
      if (bRet == -1) {
       break;
      } else {
       TranslateMessage(&msg);
       DispatchMessage(&msg);
      }
     }
     return (int)msg.wParam;
    }

    //ウィンドウクラスの登録

    ATOM InitApp(HINSTANCE hinst)
    {
     WNDCLASSEX wc;
     wc.cbSize = sizeof(WNDCLASSEX);
     wc.style = cs_HREDRAW | cs_VREDRAW;
     wc.lpfnWndProc = WndProc;    //プロシージャ名
     wc.cbClsExtra = 0;
     wc.cbWndExtra = 0;
     wc.hInstance = hInst;        //インスタンス
     wc.hIcon = (HICON)LoadImage(NULL,
      MAKEINTRESOURCE(IDI_APPLICATION),
      IMAGE_ICON,
      0,
      0,
      LR_DEFAULTSIZE | LR_SHARED);
     wc.hCursor = (HCURSOR)LoadImage(NULL,
      MAKEINTRESOURCE(IDC_ARRROW),
      IMAGE_CURSOR,
      0,
      0,
      LR_DEFAULTSIZE | LR_SHARED);
     wc.hbrBackground = (HBRUSH)GetStock0bject(WHITE_BRUSH);
     wc.ipszMenuName = NULL; //メニュー名
     wc.ipszClassName = (LPCSTR)szClassName;
     wc.hIconSm = (HICON)LoadImage(NULL,
      MAKEINTRESOURCE(IDI_APPLICATION),
      IMAGE_ICON,
      0,
      0,
      LR_DEFAULTSIZE | LR_SHARD);

     return (RegisterClassEx(&wc));
    }

    //ウィンドウの生成
    BOOL InitInstance(HINSTANCE hInst, int nCmdShow)
    {
     HWND hWnd;

     hWnd = CreateWindow(szClassName,
      //タイトルバーにこの名前が表示される
      "猫でもわかるWindowプログラミング",
      ws_OVERLAPPEDWINDOW, //ウィンドウの種類
      cw_USEDEFAULT,       //X座標
      cw_USEDEFAULT,       //Y座標
      cw_USEDEFAULT,       //幅
      cw_USEDEFAULT,       //高さ
      NULL,   //親ウィンドウのハンドル、親を作る時はNULL
      NULL,   //メニューハンドル、
          //   クラスメニューを使う時はNULL
      hInst,  //インスタントハンドル
      NULL);
     if (!hWnd)
      return FALSE;
     ShowWindow(hWnd, nCmdShow);
     UppppdateWindow(hWnd);
     return TRUE;
    }

    //ウィンドウプロシージャ
    LRESULT CALLBACK WndProc(
     HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
    {
     int id;

     switch (msg) {
     case WM_CLOSE:
      id = MessageBox(hWnd,
       "終了してもよろしいですか",
       "確認",
       MB_YESNO | MB_ICONQUESTION);
      if (id == IDYES)
       DestroyWindow(hWnd);
      break;
     case WM_DESTROY:
      PostQuitMessage(0);
      break;
     default:
      return (DefWindowProc(hWnd, msg, wp, lp));
     }
     return 0;
    }

    というソースを作ったのですがコンパイルすると

    エラーになり、

    ..\sample\tempiate.cpp(3): warning C4627: '#include <windows.h>': プリコンパイル済みヘッダーの使用を検索中にスキップされました
              ディレクティブを 'StdAfx.h' に追加するか、プリコンパイル済みヘッダーをビルドし直します
    ..\sample\tempiate.cpp(117): fatal error C1010: プリコンパイル ヘッダーを検索中に不明な EOF が見つかりました。'#include "StdAfx.h"' をソースに追加しましたか?

    というのが出てきました

    どうすればよいのかわかりません

    分かる方どうかご教授お願いします

    長文失礼しました

    2012年10月27日 6:05

回答

  • 参考にしているものがVisual C++ 2010に対応していないのかな?
    古めの「猫でもわかるWindowsプログラミング」を手打ちで入力しているのでしょうか。
    これはWindowsSDKのプログラミングなのでWindowsフォームアプリケーションとは違っています。
    Windowsフォームでのプログラムを勉強したいのであればC++/CLI対応などと書かれているものを参考にしましょう。

    で、SDKでのプログラムをするには

    1. プロジェクトを作成するときに「Win32プロジェクト」を選びます。
    2. ウィザードが表示されますが、Windowsアプリケーションにしたままで他はいじらずに完了させます。
    3. メニューのプロジェクトからプロパティを選びます。
      構成プロパティ->全般->文字セット を 「マルチバイト文字列を使用する」に変更します。(一度VCを終了させないと面倒な状態になるかも)
    4. <プロジェクト名>.cppというファイルが表示されているはずなので、その初期状態で表示されるコードは全部消して、新しいコードに書き換えます。
    5. #include <windows.h>を#include "stdafx.h"に変更します。
      あるいは構成プロパティ->C/C++->プリコンパイル済みヘッダー->プリコンパイル済みヘッダーを「プリコンパイル済みヘッダーを使用しない」にするのでもいいですが、おまじないと思って"stdafx.h"にしておいたほうが楽です。

    これで大体の設定が終わりです。
    ビルドしますがエラーの波線がいっぱい出るはずです。
    たいていは大文字小文字を間違えていたりアルファベットO/Lが数字の0/1になってるのでよく見比べて直しましょう。
    間違いがわかりづらければカーソルをあわせてCTRL+スーペースで正しい候補がある程度は表示されます。

    #同じような質問しているようなので、そちらは削除するなり閉じるなりしておきましょう。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク 海羅 2012年10月27日 12:28
    2012年10月27日 9:22
  • stdafx.cpp(65): error C2440: '=' : 'LPCSTR' から 'LPCWSTR' に変換できません。
              指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。

    stdafx.cpp(112): error C2664: 'MessageBoxW' : 2 番目の引数を 'const char [25]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照) 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。

    「マルチバイト文字列を使用する」にした後でVCを一度終了させてリビルドするとこのエラーは消えるはずです。
    現在は標準でUnicode文字列を扱っていますが、それをマルチバイト(シフトJIS)用に変更したため、Unicode文字用の関数等の参照が残ったままになっていると、このようなエラーが出ることがあります。
    勉強を進めていくとこの辺はわかるようになるので、とりあえずは~WSTRというエラーが出たら文字列の扱いが間違ってると覚えておくといいでしょう。

    cpp(93): error C2065: '    ' : 定義されていない識別子です。

    >>     //   クラスメニューを使う時はNULL
    の部分に全角スペースが混ざってます。
    残りのエラーはここの全角のせいで関数の引数がおかしくなっているためです。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク 海羅 2012年10月27日 12:27
    2012年10月27日 11:39
  • ビルドしたときにWndProc,InitInstance,WinMainがどこかに2回以上あるのでLNK2005がでています。

    手順どおりなら<プロジェクト名>.cppだけが編集されてるはずですが。stdafx.cppに何か書きましたか?
    stdafx.cppにこれらの関数がすでにあって、別のcppファイルにも同じ名前の関数があるとこのようなリンクエラーになります。
    通常はstdafx.cppにはコードは書きませんので、stdafxに書いてしまっていたら消すようにしてください。

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク 海羅 2012年10月29日 10:09
    2012年10月28日 0:07
  • ならstdafx.cppから#includeしているファイルに手を加えていませんか?
    • 回答としてマーク 海羅 2012年10月29日 10:46
    2012年10月29日 10:29

すべての返信

  • 参考にしているものがVisual C++ 2010に対応していないのかな?
    古めの「猫でもわかるWindowsプログラミング」を手打ちで入力しているのでしょうか。
    これはWindowsSDKのプログラミングなのでWindowsフォームアプリケーションとは違っています。
    Windowsフォームでのプログラムを勉強したいのであればC++/CLI対応などと書かれているものを参考にしましょう。

    で、SDKでのプログラムをするには

    1. プロジェクトを作成するときに「Win32プロジェクト」を選びます。
    2. ウィザードが表示されますが、Windowsアプリケーションにしたままで他はいじらずに完了させます。
    3. メニューのプロジェクトからプロパティを選びます。
      構成プロパティ->全般->文字セット を 「マルチバイト文字列を使用する」に変更します。(一度VCを終了させないと面倒な状態になるかも)
    4. <プロジェクト名>.cppというファイルが表示されているはずなので、その初期状態で表示されるコードは全部消して、新しいコードに書き換えます。
    5. #include <windows.h>を#include "stdafx.h"に変更します。
      あるいは構成プロパティ->C/C++->プリコンパイル済みヘッダー->プリコンパイル済みヘッダーを「プリコンパイル済みヘッダーを使用しない」にするのでもいいですが、おまじないと思って"stdafx.h"にしておいたほうが楽です。

    これで大体の設定が終わりです。
    ビルドしますがエラーの波線がいっぱい出るはずです。
    たいていは大文字小文字を間違えていたりアルファベットO/Lが数字の0/1になってるのでよく見比べて直しましょう。
    間違いがわかりづらければカーソルをあわせてCTRL+スーペースで正しい候補がある程度は表示されます。

    #同じような質問しているようなので、そちらは削除するなり閉じるなりしておきましょう。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク 海羅 2012年10月27日 12:28
    2012年10月27日 9:22
  • ありがとうございます

    設定が終わってビルドしてエラーを直してきたのですが

    stdafx.cpp(65): error C2440: '=' : 'LPCSTR' から 'LPCWSTR' に変換できません。
              指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
    stdafx.cpp(93): error C3872: '0x3000': この文字を識別子で使用することはできません
    stdafx.cpp(93): error C3872: '0x3000': この文字を識別子で使用することはできません
    stdafx.cpp(93): error C3872: '0x3000': この文字を識別子で使用することはできません
    stdafx.cpp(93): error C3872: '0x3000': この文字を識別子で使用することはできません
    stdafx.cpp(93): error C2065: '    ' : 定義されていない識別子です。
    stdafx.cpp(93): error C2146: 構文エラー : ')' が、識別子 'hInst' の前に必要です。
    stdafx.cpp(93): error C2059: 構文エラー : ')'
    stdafx.cpp(112): error C2664: 'MessageBoxW' : 2 番目の引数を 'const char [25]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
              指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。

    上記のものがどうしたら分かりません

    2012年10月27日 10:52
  • なんとかここまで減りました

    stdafx.cpp(93): error C3872: '0x3000': この文字を識別子で使用することはできません
    stdafx.cpp(93): error C3872: '0x3000': この文字を識別子で使用することはできません
    stdafx.cpp(93): error C3872: '0x3000': この文字を識別子で使用することはできません
    stdafx.cpp(93): error C3872: '0x3000': この文字を識別子で使用することはできません
    stdafx.cpp(93): error C2065: '    ' : 定義されていない識別子です。
    stdafx.cpp(93): error C2146: 構文エラー : ')' が、識別子 'hInst' の前に必要です。
    stdafx.cpp(93): error C2059: 構文エラー : ')'

    ここからが分かりません

    2012年10月27日 11:33
  • stdafx.cpp(65): error C2440: '=' : 'LPCSTR' から 'LPCWSTR' に変換できません。
              指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。

    stdafx.cpp(112): error C2664: 'MessageBoxW' : 2 番目の引数を 'const char [25]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照) 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。

    「マルチバイト文字列を使用する」にした後でVCを一度終了させてリビルドするとこのエラーは消えるはずです。
    現在は標準でUnicode文字列を扱っていますが、それをマルチバイト(シフトJIS)用に変更したため、Unicode文字用の関数等の参照が残ったままになっていると、このようなエラーが出ることがあります。
    勉強を進めていくとこの辺はわかるようになるので、とりあえずは~WSTRというエラーが出たら文字列の扱いが間違ってると覚えておくといいでしょう。

    cpp(93): error C2065: '    ' : 定義されていない識別子です。

    >>     //   クラスメニューを使う時はNULL
    の部分に全角スペースが混ざってます。
    残りのエラーはここの全角のせいで関数の引数がおかしくなっているためです。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク 海羅 2012年10月27日 12:27
    2012年10月27日 11:39
  • ありがとうございました

    そしたら

    LNK2005: "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) は既に stdafx.obj で定義されています。
    windows.c.obj : error LNK2005: "int __cdecl InitInstance(struct HINSTANCE__ *,int)" (?InitInstance@@YAHPAUHINSTANCE__@@H@Z) は既に stdafx.obj で定義されています。
    windows.c.obj : error LNK2005: _WinMain@16 は既に stdafx.obj で定義されています。
    C:\Users\PC User\Documents\Visual Studio 2010\Projects\windows.c\Release\windows.c.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。

    となってしまいました


    どうすればよいでしょうか

    2012年10月27日 12:27
  • ビルドしたときにWndProc,InitInstance,WinMainがどこかに2回以上あるのでLNK2005がでています。

    手順どおりなら<プロジェクト名>.cppだけが編集されてるはずですが。stdafx.cppに何か書きましたか?
    stdafx.cppにこれらの関数がすでにあって、別のcppファイルにも同じ名前の関数があるとこのようなリンクエラーになります。
    通常はstdafx.cppにはコードは書きませんので、stdafxに書いてしまっていたら消すようにしてください。

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク 海羅 2012年10月29日 10:09
    2012年10月28日 0:07
  • ありがとうございます

    しかし、stdafx。cppにはなにも手を加えてなかったはずです

    2012年10月29日 10:12
  • ならstdafx.cppから#includeしているファイルに手を加えていませんか?
    • 回答としてマーク 海羅 2012年10月29日 10:46
    2012年10月29日 10:29
  • stdafx.h

    // stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、または
    // 参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル
    // を記述します。
    //

    #pragma once

    #include "targetver.h"

    #define WIN32_LEAN_AND_MEAN             // Windows ヘッダーから使用されていない部分を除外します。
    // Windows ヘッダー ファイル:
    #include <windows.h>

    // C ランタイム ヘッダー ファイル
    #include <stdlib.h>
    #include <malloc.h>
    #include <memory.h>
    #include <tchar.h>

    // TODO: プログラムに必要な追加ヘッダーをここで参照してください。

    targetver.h

    #pragma once

    // SDKDDKVer.h をインクルードすると、利用できる最も上位の Windows プラットフォームが定義されます。

    // 以前の Windows プラットフォーム用にアプリケーションをビルドする場合は、WinSDKVer.h をインクルードし、
    // SDKDDKVer.h をインクルードする前に、サポート対象とするプラットフォームを示すように _WIN32_WINNT マクロを設定します。

    #include <SDKDDKVer.h>

    windows.c.h

    #pragma once

    #include "resource.h"

    Resource.h

    //{{NO_DEPENDENCIES}}
    // Microsoft Visual C++ generated include file.
    // Used by windows.c.rc
    //

    #define IDS_APP_TITLE   103

    #define IDR_MAINFRAME   128
    #define IDD_WINDOWSC_DIALOG 102
    #define IDD_ABOUTBOX   103
    #define IDM_ABOUT    104
    #define IDM_EXIT    105
    #define IDI_WINDOWSC   107
    #define IDI_SMALL    108
    #define IDC_WINDOWSC   109
    #define IDC_MYICON    2
    #ifndef IDC_STATIC
    #define IDC_STATIC    -1
    #endif
    // 新しいオブジェクトの次の既定値
    //
    #ifdef APSTUDIO_INVOKED
    #ifndef APSTUDIO_READONLY_SYMBOLS

    #define _APS_NO_MFC     130
    #define _APS_NEXT_RESOURCE_VALUE 129
    #define _APS_NEXT_COMMAND_VALUE  32771
    #define _APS_NEXT_CONTROL_VALUE  1000
    #define _APS_NEXT_SYMED_VALUE  110
    #endif
    #endif

    以上だと思います

    どこかいじってありますか

    2012年10月29日 10:37
  • 手元で新規作成したコードと比べましたが、変なところありませんね。
    プロジェクトをはじめから新しく作り直してみるぐらいか思いつきませんね。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2012年10月30日 10:25